通用类型的托管记录产生编译时错误“类型参数'T'必须为非空值类型”

fpiette

我正在尝试使用托管记录作为具有记录约束的通用类的数据类型。

编译器抱怨: 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通用类型<T>参数的函数名前

为了在通用类型或方法“ System.Nullable <T>”中将其用作参数T,类型“字符串”必须为非空类型

该类型必须是引用类型,才能在通用类型或方法中将其用作参数“ T”

从Java中的通用类型推断通用类型(编译时错误)

T必须是具有公共无参数构造函数的非抽象类型,才能在通用类型或方法中将其用作参数“ TModel”

类型“ MyObject”必须是非空值类型,才能在通用类型或方法“ Nullable <T>”中用作参数“ T”

异步方法的返回类型必须为空,Task或Task <T>

错误TS2314:通用类型'Promise <T>'需要1个类型参数

Angular 5升级错误:通用类型'InjectionToken <T>'需要1个类型参数

该类型必须是非空值类型,才能在通用类型或方法“ System.Nullable <T>”中用作参数“ T”

强制函数的参数必须属于通用类型T

打字稿错误:TS2314:通用类型'ElementRef <T,any>'需要2个类型参数

指定参数类型为T | 空但非空

ConfigurationManager错误:通用类型'configurationmanager <T>'需要1个类型参数

当“ T”通用类型为“ void”时,如何删除参数?

类型参数“ T”必须为类类型

C#Vector类型必须为非空吗?

使用通用类型接口创建对象实例时发生编译错误

如何解决编译时的类型错误:A到T?

类型为<T>的类,其类型为<T>的可为空

TypeError:错误#2007参数类型必须为非null

根据静态条件延迟对非嵌套类型的引用,而不会产生编译错误?

Java:将实现列表的映射分配给通用类型的列表的映射时发生编译错误

托管类类型作为类型参数T的类型(错误C2670)

通用类::类型参数<T>属性继承

Java在原始类型上使用instanceof方法产生编译器错误

类型错误:错误 #2007:参数 hitTestObject 必须为非空。单击事件时出错

错误:必须返回非空值,因为返回类型“Widget”不允许为空

泛型类型参数的下划线在 Scala 中产生编译错误?