我正在尝试使用托管记录作为具有记录约束的通用类的数据类型。
编译器抱怨: E2512 Type parameter 'T' must be non-nullable value type
我做了一个最小的可复制示例:
program GenericDemo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TDataRec1 = record
Data : Integer;
end;
TDataRec2 = record
Data : Integer;
class operator Initialize(out Dest : TDataRec2);
end;
TDataGen<T : record> = class
end;
class operator TDataRec2.Initialize(out Dest : TDataRec2);
begin
end;
var
X : TDataGen<TDataRec1>; // <==== This is OK
Y : TDataGen<TDataRec2>; // <==== Error: "Type parameter 'T' must be non-nullable value type"
begin
end.
编译器接受变量X声明(经典记录),但拒绝变量Y的声明(托管记录)。
我使用的是Delphi 10.4版本27.0.38860.1461。
我的问题是:如何在泛型类中使用托管记录?
到目前为止,自定义托管记录与记录约束不兼容。
由于我们没有正式的语言规范,因此我们只能猜测这是有意还是无意。
您只能通过删除记录GetTypeKind(T)
约束来使此代码起作用,并使用它在要处理的有效类型上添加一些断言-但是,这将允许为T编译错误类型,但在运行时给出错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句