在尝试修改我的一个记录以使用泛型时,我发现在一个方法的签名中组合泛型和数组会产生一个错误:
类型[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;
在每个示例中,方法签名中的每个类型都可以涉及数组或泛型,但不能同时涉及两者。
我对这种现象有几个问题:
- 是否有技术原因导致无法将这些功能结合起来?
- 如果没有,那么开发人员是否解释了为什么它不受支持?
- 为什么错误被描述为“尚未完全定义”?(这不是错误的充分条件;不管类型是否为泛型,也不管它是否是数组,它都是真的。
- 有没有办法绕过这个限制?
1条答案
按热度按时间rjzwgtxy1#
泛型类型是在编译期间准备的。当编译器到达DoFooList时,为代码中使用的每个类型生成一个DoFooList函数。无法准备具有未定义类型的函数。应该是在编译时定义的所有内容。
如果像这样使用它,将工作: