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

Delphi中的“类型”声明代表什么,它如何被使用

发布时间:2020-12-15 10:18:46 所属栏目:大数据 来源:网络整理
导读:在Datasnap.DSReflect单元中有一些奇怪的代码 TDSAdapterClassType = type of TDSAdapterClass; TDSAdapterClass = class(TPersistent) private FAdapteeInstance: TObject; public constructor Create(AdapteeInstance: TObject); virtual; end; 然后就这样
在Datasnap.DSReflect单元中有一些奇怪的代码
TDSAdapterClassType = type of TDSAdapterClass;

  TDSAdapterClass = class(TPersistent)
  private
    FAdapteeInstance: TObject;
  public
    constructor Create(AdapteeInstance: TObject); virtual;
  end;

然后就这样使用了

var
  AdapteeInstance: TObject;
  FClassRef: TPersistentClass;

  Result := TDSAdapterClassType(FClassRef).Create(AdapteeInstance);

一见钟情似乎就像另一种声明类参考的方式。但是逻辑意味着在不增加更多功能的情况下引入语言结构的这种变化是没有意义的。根据逻辑,我发现以下声明编译:

type
  TypeOfInteger = type of Integer;
  TypeOfByte = type of Byte;

  TRec = record
    x: integer;
  end;
  TypeOfTRec = type of TRec;

  TBytes = array of byte;
  TypeOfTBytes = type of TBytes;

有趣的是,以下声明无法编译。

type
  TypeOfString = type of String;

所以问题是什么类型的实际代表,如何在现实生活中应用,除了某种类别的别名

注意:在Delphi 7中不编译的类型,它似乎是在后面介绍的,它在XE中是绝对的,但是我没有安装Delphi 2007-2010来尝试它。

更新:我已经填写错误报告https://quality.embarcadero.com/browse/RSP-9850

解决方法

没有记录行为是不可重复的。一些行为感觉像是类,但是我们不需要另外一种方式去做。值类型的类是荒谬的。

我的结论是这必须是一个编译器的bug。代码无效,应由编译器拒绝。错误是代码被接受而不被拒绝。

从Hallvard Vassbotn的article可以看出,Delphi .net编译器的一个功能是创建映射到.net的System.RuntimeTypeHandle类型的类型。因此,松散地说,提供与C#类型运算符相当的功能的类型。

我最好的猜测是,Delphi桌面编译器接受不应该的类型,作为.net编译器的遗迹。

(编辑:李大同)

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

    推荐文章
      热点阅读