泛型类型的托管记录产生编译时错误 "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 的错误类型,但会给出一个运行时出错。