![]() |
Typ-Kompatibilitäts-Regeln bei Generics mit overloads
Dieses Verhalten (Aufruf {2} im Code) hat mich (nach etlichen Programmier-Stunden in der Annahme dass es anders wäre) kalt überrascht:
Delphi-Quellcode:
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.
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. 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... |
AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads
Klar ist das bestimmt nirgendwo formalisiert, aber ich finde das wenig überraschend: Angenommen es wären
Delphi-Quellcode:
oder
var
Delphi-Quellcode:
-Parameter: Da kann er ja schlecht das
const
Delphi-Quellcode:
in die Methode mit dem
Byte
Delphi-Quellcode:
-Parameter stecken, nur weil ein Byte auch in ein Word "passen" würde.
Word
|
AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads
Zitat:
Bei 4 passt der Typ ganz genau, auf dessen Signatur. Und bei 2 ......... Type Inference (implizite Wahl des T, anhand des Typs vom Parameter) ![]() |
AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads
Zitat:
|
AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads
Bei
Delphi-Quellcode:
und
var
Delphi-Quellcode:
und vermutlich auch
out
Delphi-Quellcode:
muß es genau passen und es muß eine Variable sein.
const [ref]
Bei nichts und
Delphi-Quellcode:
entscheidet Delphi, ob als Referenz oder Value und ob es auch eine Kopie
const
und es kann auch eine Kopie sein, was z.B. für Function-Result und Property nötig wäre. |
AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads
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 ![]() |
AW: Typ-Kompatibilitäts-Regeln bei Generics mit overloads
Zitat:
Ich war halt auf die Annahme hereingefallen, dass zur Auflösung von Aufrufen ohne Typangabe <...> nur nicht-generische overload-Varianten in Betracht kommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 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