请考虑以下代码:
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编译器总是将内置类型提升为内置类型吗?
更一般地说,在这种情况下控制类型促销的规则(比如我们有2种内置类型,或2种用户定义类型等)?
答案 0 :(得分:2)
根据我的理解,像uint64
这样的序数类型将始终更接近longword
之类的其他序数类型,而不是record
。周期。
“更近类型”距离与“内置”或“自定义”类型无关。你正在比较苹果和橘子。
在编译器中,记录和序数是两个不同的系列。您可以定义隐式转换的事实永远不会促使record
成为序数类型。
因此,“内置”string
与integer
的关联性始终低于新的序数类型,如:
type TMyInteger64 = type Int46;
此处,此TMyInteger64
类型将比内置string
类型“更近”。
一旦定义record
,它就会与其他record
具有亲缘关系,而不是序数类型。