微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 类型推广重载函数的参数

请考虑以下代码
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种用户定义的类型等),更通常地说什么规则控制类型的升级

解决方法

对于我的理解,像uint64这样的顺序类型将总是更接近另一个顺序类型,如长剑,而不是记录.期.

“更近的类型”距离不是关于“内置”或“自定义”类型.你正在比较苹果和橘子.

在编译器中,记录和序数是两个不同的家族.您可以定义隐式转换的事实不会促使记录成为序数类型.

因此,一个“内置”字符串将始终与一个整数比一个新的顺序类型更小的亲和力,如:

type TMyinteger64 = type Int46;

在这里,这个TMyinteger64类型将比内置的字符串类型“更接近”.

一旦定义了一个记录,它将与其他记录(不是顺序类型)具有亲和力.

原文地址:https://www.jb51.cc/delphi/102635.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐