在 Delphi 方法签名中,为什么泛型不能与数组结合?

1cklez4t  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(93)

在尝试修改我的一个记录以使用泛型时,我发现在一个方法的签名中组合泛型和数组会产生一个错误:
类型[type]尚未完全定义
我举两个最小的例子。第一个是参数类型:

TRec1 = record
    procedure DoFooList(A: TArray<TRec1>);
  end;

  TGeneRec1<T> = record
    procedure DoFoo(G: TGeneRec1<T>);
    procedure DoFooList(A: TArray<TGeneRec1<T>>); // This causes an error.
  end;

第二个是返回类型:

TRec2 = record
    function ReturnFooList: TArray<TRec2>;
  end;

  TGeneRec2<T> = record
    function ReturnFoo: TGeneRec2<T>;
    function ReturnFooList: TArray<TGeneRec2<T>>; // This causes an error.
  end;

在每个示例中,方法签名中的每个类型都可以涉及数组或泛型,但不能同时涉及两者。
我对这种现象有几个问题:

  • 是否有技术原因导致无法将这些功能结合起来?
  • 如果没有,那么开发人员是否解释了为什么它不受支持?
  • 为什么错误被描述为“尚未完全定义”?(这不是错误的充分条件;不管类型是否为泛型,也不管它是否是数组,它都是真的。
  • 有没有办法绕过这个限制?
rjzwgtxy

rjzwgtxy1#

泛型类型是在编译期间准备的。当编译器到达DoFooList时,为代码中使用的每个类型生成一个DoFooList函数。无法准备具有未定义类型的函数。应该是在编译时定义的所有内容。

TGeneRec1<T> = record 
  procedure DoFoo(G: TGeneRec1<T>);
  procedure DoFooList<T1 : record>(A: TArray<T1>); 
end;

如果像这样使用它,将工作:

procedure example
var 
  lExVar : TGeneRec1<Type>; 
  lExArr : TArray<TGeneRec1<Type>>
begin
  lExVar.DoFooList<TGeneRec1<Type>>(lExArr );   
end;

相关问题