【发布时间】:2015-02-17 18:04:55
【问题描述】:
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;
所以问题是type of 实际代表什么以及如何在实际应用中使用它,除了作为class of 的某种别名
注意: type of 在 Delphi 7 中无法编译,好像后面会介绍,XE 中肯定有,但我没有安装 Delphi 2007-2010在那里试试。
更新:我已经填写了错误报告https://quality.embarcadero.com/browse/RSP-9850
【问题讨论】:
-
它的行为类似于
type,用于创建不同的类型。 -
@TLama:有趣:我认为(可能是错误的)“TSomethingelse = type TSomething”在 D7 中做到了?
-
TFooClass = type of TFoo与TFooClass = class of TFoo相同,但您不能写TIntegerClass = class of Integer,因为Integer只是一个类型而不是一个类。TFoo是一个类类型,因此您可以同时使用这两种类型。String因为引用计数而介于类型和接口之间,也许他们错过了包含它或者不知道如何告诉编译器:o) -
编译器错误或 Delphi for .NET 的遗留问题,它会给你一个类型引用。 IOW,
type TInterfaceRef = type of interface. -
@David 我确实问过他们,不是吗 ;-) 有些人在这里闲逛。开个玩笑,我确实希望对 QP 报告有一些反馈,但这可能需要一些时间。
标签: delphi