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

前端之家收集整理的这篇文章主要介绍了Delphi中的“类型”声明代表什么,它如何被使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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编译器的遗迹。

原文链接:https://www.f2er.com/delphi/103550.html

猜你在找的Delphi相关文章