Рассмотрим следующий код:
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 пользовательских типа и т.д.)?