AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Typ-Kompatibilitäts-Regeln bei Generics mit overloads
Thema durchsuchen
Ansicht
Themen-Optionen

Typ-Kompatibilitäts-Regeln bei Generics mit overloads

Ein Thema von DenkDirNix · begonnen am 11. Dez 2024 · letzter Beitrag vom 11. Dez 2024
Antwort Antwort
DenkDirNix

Registriert seit: 13. Dez 2018
71 Beiträge
 
Delphi 11 Alexandria
 
#1

Typ-Kompatibilitäts-Regeln bei Generics mit overloads

  Alt 11. Dez 2024, 18:29
Dieses Verhalten (Aufruf {2} im Code) hat mich (nach etlichen Programmier-Stunden in der Annahme dass es anders wäre) kalt überrascht:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

type
  TMyclass = class
    class procedure Send ( v: word ); overload;
    class procedure Send<T>( v: T ); overload;
  end;

var
  b: byte = 255;
  w: word = 256;


class procedure TMyclass.Send( v: word );
begin
  writeln( 'Send' );
end;

class procedure TMyclass.Send<T>( v: T );
begin
  writeln( 'Send<T>' );
end;


begin
{1} TMyclass.Send<byte>( b ); // ruft Send<T> auf, okay
{2} TMyclass.Send ( b ); // ruft Send<T> auf, ??
{3} TMyclass.Send<word>( w ); // ruft Send<T> auf naja
{4} TMyclass.Send ( w ); // ruft Send auf, okay
ReadLn
end.
Die Typ-Kompatibilität der generischen Methode Send<T> wird bei der Auswahl der passenden overload-Methode für Aufruf {2} als stärker gewichtet als die Kompatibilität des Aufruf-Parameter-Typs "byte" zum formalen Parameter-Typ "word" des nicht-generischen Send.
Zumindest das Fehlen des konkreten Typs <byte> sollte doch den Compiler dazu bewegen, nur die nicht-generischen overloads in Betracht zu ziehen. Hätte ich so gedacht...
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads

  Alt 11. Dez 2024, 18:38
Klar ist das bestimmt nirgendwo formalisiert, aber ich finde das wenig überraschend: Angenommen es wären var oder const -Parameter: Da kann er ja schlecht das Byte in die Methode mit dem Word -Parameter stecken, nur weil ein Byte auch in ein Word "passen" würde.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.306 Beiträge
 
Delphi 12 Athens
 
#3

AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads

  Alt 11. Dez 2024, 18:55
Zitat:
naja
Bei 3 und auch 1 sagst du explizit, dass <T> genommen werden soll/muss.

Bei 4 passt der Typ ganz genau, auf dessen Signatur.

Und bei 2 ......... Type Inference (implizite Wahl des T, anhand des Typs vom Parameter)
https://www.developer-experts.net/20...neric-methods/
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.106 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads

  Alt 11. Dez 2024, 19:07
Angenommen es wären var oder const -Parameter: Da kann er ja schlecht das Byte in die Methode mit dem Word -Parameter stecken, nur weil ein Byte auch in ein Word "passen" würde.
Bei const kann ich das sehr wohl.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.306 Beiträge
 
Delphi 12 Athens
 
#5

AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads

  Alt 11. Dez 2024, 19:52
Bei var und out und vermutlich auch const [ref] muß es genau passen und es muß eine Variable sein.

Bei nichts und const entscheidet Delphi, ob als Referenz oder Value und ob es auch eine Kopie
und es kann auch eine Kopie sein, was z.B. für Function-Result und Property nötig wäre.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.039 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads

  Alt 11. Dez 2024, 20:08
Wenn es keine exakte Übereinstimmung mit einer nicht generischen Überladung gibt, hat immer die generische Methode Vorrang gegenüber einer Überladung, für die eine sogenannte "widening conversion" ausgeführt werden muss.

Das ist mal ausnahmsweise auch genauso wie in einer gewissen anderen Programmiersprache.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (11. Dez 2024 um 20:10 Uhr)
  Mit Zitat antworten Zitat
DenkDirNix

Registriert seit: 13. Dez 2018
71 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads

  Alt 11. Dez 2024, 21:10
Wenn es keine exakte Übereinstimmung mit einer nicht generischen Überladung gibt, hat immer die generische Methode Vorrang gegenüber einer Überladung, für die eine sogenannte "widening conversion" ausgeführt werden muss.
Sehr schön knackig und präzise formuliert.

Ich war halt auf die Annahme hereingefallen, dass zur Auflösung von Aufrufen ohne Typangabe <...> nur nicht-generische overload-Varianten in Betracht kommen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz