包含不同数据类型的RTTI的TTypeData字段有三个不同的动态数组元素类型值:
elType: PPTypeInfo; // nil if type does not require cleanup
elType2: PPTypeInfo; // independent of cleanup
DynArrElType: PPTypeInfo; // actual element type, even if dynamic array
elType
的目的很明确:它在RTL中由FinalizeArray
使用,如果没有任何内容可以最终确定,则保留 nil 。但是我们还有另外两个元素elType2
和DynArrElType
。有谁知道为什么有两个,两者之间有什么区别?
答案 0 :(得分:2)
只能回答关于elType2
的问题,因为这是我过去使用的唯一一个,该字段用于保存数组的元素类型。检查此样本
{$APPTYPE CONSOLE}
uses
TypInfo,
SysUtils;
type
TDateArray = array of TDateTime;
Var
p : PPTypeInfo;
begin
try
p:=TypInfo.GetTypeData(TypeInfo(TDateArray)).elType2;
Writeln(TypInfo.GetTypeName(p^));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
这将返回TDateTime,这是TDateArray
类型元素的类型。
BTW,DynArrElType
DynUnitName: ShortStringBase
字段
答案 1 :(得分:0)
据我所知,RTL没有使用elType2
和DynArrElType
来表示任何事情。编译器可能正在将这些值作为额外元数据发布,可能用于文档生成器等。