键入重载函数的参数的提升

时间:2015-01-31 06:48:53

标签: delphi type-promotion

请考虑以下代码:

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种用户定义类型等)?

1 个答案:

答案 0 :(得分:2)

根据我的理解,像uint64这样的序数类型将始终更接近longword之类的其他序数类型,而不是record。周期。

“更近类型”距离与“内置”或“自定义”类型无关。你正在比较苹果和橘子。

在编译器中,记录和序数是两个不同的系列。您可以定义隐式转换的事实永远不会促使record成为序数类型。

因此,“内置”stringinteger的关联性始终低于新的序数类型,如:

type TMyInteger64 = type Int46;

此处,此TMyInteger64类型将比内置string类型“更近”。

一旦定义record,它就会与其他record具有亲缘关系,而不是序数类型。