我在尝试定义嵌套通用记录时遇到了一个奇怪的编译器错误。
嵌套适用于类和接口,但不能以某种方式记录。
type
TRec<T> = record
Value: T;
end;
TCls = class
public
Rec: TRec<TRec<Integer>>;
end;
这不是在 Delphi Berlin 10.1.2 上编译的,而且在 Tokyo 10.2.3 上也没有运气。这是语言或编译器问题的限制吗?
错误消息是:
[dcc32错误] Project1.dpr(22):E2564未定义类型'TRec&lt; T&gt;'
我只想要一次嵌套Spring.Nullable<>
类型,但这不起作用。之后我用一个简单的通用记录快速复制了它。
答案 0 :(得分:9)
这是编译器错误,您应该提交错误报告。请考虑以下事项:
type
TRec<T> = record
Value: T;
end;
var
Rec: TRec<TRec<Integer>>; // compiles successfully
RecArray: TArray<TRec<TRec<Integer>>>; // compiles successfully
procedure foo;
var
Rec: TRec<TRec<Integer>>; // compiles successfully
begin
end;
type
TContainingClass = class
Rec: TRec<TRec<Integer>>; // E2564 Undefined type 'TRec<T>'
end;
TContainingRecord = record
Rec: TRec<TRec<Integer>>; // E2564 Undefined type 'TRec<T>'
end;
TContainingObject = object
Rec: TRec<TRec<Integer>>; // E2564 Undefined type 'TRec<T>'
end;
在聚合化合物类型中使用类型时,似乎会出现缺陷。
它有些蹩脚,但这是我能找到的唯一解决办法:
type
TRec<T> = record
Value: T;
end;
TRecRec<T> = record
Value: TRec<T>;
end;
TContainingClass = class
Rec: TRecRec<Integer>;
end;
但在任何现实世界的情况下,这都不会有用。