2015-01-31 8 views
13

Betrachten Sie den folgenden Code ein:Typ Förderung der überladenen Funktion Argument

program Promote; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

{$HINTS OFF} 

type 
    MyWord = record 
    FValue: LongWord; 
    class operator Implicit(AValue: LongWord): MyWord; 
    end; 

class operator MyWord.Implicit(AValue: LongWord): MyWord; 
begin 
    Result.FValue:= AValue; 
end; 

procedure Test(AValue: MyWord); overload; 
begin 
    Writeln('MyWord'); 
end; 

procedure Test(AValue: UInt64); overload; 
begin 
    Writeln('UInt64'); 
end; 

var 
    LW: LongWord; 

begin 
    Test(LW); 
    Readln; 
end. 

Wenn ich es laufen (Delphi XE) Ich sehe, dass der Compiler LongWord Parameter UInt64 (integrierter Typ) fördert, nicht zu MyWord (benutzerdefinierter Typ).

Kann ich davon ausgehen, dass Delphi-Compiler immer einen integrierten Typ zu einem integrierten Typ fördert, wenn eine solche Promotion im Compiler selbst implementiert ist?

Allgemeiner, welche Regeln steuern Art Förderung in solchen Situationen (sagen wir haben 2 eingebaute Typen oder 2 benutzerdefinierte Typen, etc.)?

+0

Viel Glück dabei zu arbeiten. Keine Dokumentation existiert. Das Beste, was Sie tun können, ist es umzukehren. –

+0

Ich würde ** erwarten **, dass es immer der ** nächste ** Typ ist –

+4

@Sir Es ist einfach, das zu schreiben, aber ohne eine genaue Definition der nächsten, was es bedeutet. Ich finde es sehr frustrierend, dass die Regeln für die Überladungsauflösung so unzureichend dokumentiert sind. –

Antwort

1

Zu meinem Verständnis wird ein Ordinaltyp wie uint64 immer näher an einem anderen Ordinaltyp wie longword, als ein record. Zeitraum.

Der Abstand "Typ näher" bezieht sich nicht auf "eingebaute" oder "benutzerdefinierte" Typen. Sie vergleichen Äpfel und Orangen.

Im Compiler sind Datensätze und Ordnungszahlen zwei verschiedene Familien. Die Tatsache, dass Sie eine implizite Konvertierung definieren können, würde niemals eine record zu einem ordinalen Typ werden.

Als Ergebnis eines „eingebaute“ string wird immer weniger Affinität mit einem integer als ein neuen Ordnungstyp wie:

type TMyInteger64 = type Int46; 

Hier, TMyInteger64 Typ wird „näher“ als ein gebaut -in string Typ.

Sobald Sie eine record definieren, wird es Affinitäten mit anderen record, nicht ordinal Typen haben.