我正在尝试使用RTTI的通用记录,但遇到了类型信息的问题。有谁知道为什么以下不能使用Delphi 2010进行编译?
program GenericTypeInfo;
{$APPTYPE CONSOLE}
uses
TypInfo,
SysUtils;
type
TMyRec<T> = record
public
Value: T;
end;
TMyInt = TMyRec<Integer>;
TMyString = TMyRec<String>;
begin
try
Writeln(GetTypeName(TypeInfo(TMyRec<Integer>))); <--- This works fine
Writeln(GetTypeName(TypeInfo(TMyRec<String>))); <--- so does this
Writeln(GetTypeName(TypeInfo(TMyInt))); <--- BUT this won't compile
Writeln(GetTypeName(TypeInfo(TMyString))); <--- nor this!!
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
上面指出的行会产生以下编译器错误:
[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyInt' has no type info
[DCC Error] GenericTypeInfo.dpr(24): E2134 Type 'TMyString' has no type info
我不能说2之间的最大区别是什么?我承认我不是一个低级别的专家,但为什么编译器会以不同的方式对待它?我需要它来处理TMyInt和TMyString类型。
感谢您的帮助。
答案 0 :(得分:7)
这是bug in Delphi 2010,已为XE及更高版本修复过。
但是有workaround。
答案 1 :(得分:3)
此示例在XE2中正常工作。 (和XE一样@StefanGlienke评论)。
Delphi-2010中的RTTI和泛型在很多方面都缺乏实现。
由于类型的解释是由编译器魔术完成的,因此解决方法是升级。