请考虑以下代码:
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.
当我运行它(Delphi XE)时,我看到编译器将LongWord参数推送到UInt64(内置类型),而不是MyWord(用户定义的类型).
我可以假设Delphi编译器总是将内置类型提升为内置类型,如果这样的升级是在编译器本身实现的?
解决方法
对于我的理解,像uint64这样的顺序类型将总是更接近另一个顺序类型,如长剑,而不是记录.期.
“更近的类型”距离不是关于“内置”或“自定义”类型.你正在比较苹果和橘子.
在编译器中,记录和序数是两个不同的家族.您可以定义隐式转换的事实不会促使记录成为序数类型.
因此,一个“内置”字符串将始终与一个整数比一个新的顺序类型更小的亲和力,如:
type TMyInteger64 = type Int46;
在这里,这个TMyInteger64类型将比内置的字符串类型“更接近”.
一旦定义了一个记录,它将与其他记录(不是顺序类型)具有亲和力.