加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 06:10:22 所属栏目:大数据 来源:网络整理
导读:请考虑以下代码: 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 Resul
请考虑以下代码:
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类型将比内置的字符串类型“更接近”.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读