泛型类型的托管记录产生编译时错误 "Type parameter 'T' must be non-nullable value type"
Managed record in generic type produce compile time error "Type parameter 'T' must be non-nullable value type"
我正在尝试将托管记录用作具有记录约束的通用 class 的数据类型。
编译器报错: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 声明(classic 记录)但拒绝变量 Y(托管记录)的声明。
我用的是Delphi10.4版本27.0.38860.1461.
我的问题是:如何在通用 class 中使用托管记录?
截至目前,自定义托管记录与记录约束不兼容。
由于我们没有一些正式的语言规范,我们只能猜测这是有意还是疏忽。
您只能通过删除记录约束并使用 GetTypeKind(T)
对您要处理的有效类型进行一些断言来使此代码工作 - 但是,这将允许编译 T 的错误类型,但会给出一个运行时出错。
我正在尝试将托管记录用作具有记录约束的通用 class 的数据类型。
编译器报错: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 声明(classic 记录)但拒绝变量 Y(托管记录)的声明。
我用的是Delphi10.4版本27.0.38860.1461.
我的问题是:如何在通用 class 中使用托管记录?
截至目前,自定义托管记录与记录约束不兼容。
由于我们没有一些正式的语言规范,我们只能猜测这是有意还是疏忽。
您只能通过删除记录约束并使用 GetTypeKind(T)
对您要处理的有效类型进行一些断言来使此代码工作 - 但是,这将允许编译 T 的错误类型,但会给出一个运行时出错。