为了确保我没有忽视一个奇怪的边缘案例,因为我发现了一个产生它的案例,但我想确定:
是否有任何Delphi版本可以发出包含tkUnknown
作为TTypeKind的类型的RTTI?
如果是这样的话:
在当前的Delphi XE5 RTL中,我唯一能找到处理tkUnknown
的地方是TValue,但我还没有在RTL中找到设置{{1}的代码路径包含TypeInfo TValue
Kind。
答案 0 :(得分:8)
答案是否定的。其他任何东西都是编译器中的错误。
tkUnknown
表示没有可用的类型信息可能是不连续的枚举和枚举的情况,这些枚举和枚举不是从零开始(如Barry here所解释的)和某些类型来自很久以前(如Real48
)。
当TValue.Kind
为真时,TValue.IsEmpty
也会返回它。 (因为它之前的XE2 afaik也可以返回True,如果它持有的引用类型为nil是一个bug)。
当您检索RTTI以查找不包含类型信息的内容时(如字段,属性或没有类型信息的类型的参数),您的RTTI信息不完整。在这些情况下,TRttiField.FieldType
和TRttiProperty.PropertyType
返回nil,TRttiMethod.GetParameters
返回的数组不完整。
虽然可以使用没有类型信息的类型调用TValue.Make<T>
,但由于其TypeInfo将为零,因此无法对此进行多少操作。编译器显然可以在E2134周围工作,并将nil传递给TValue.Make
。因此TValue.Kind
会说tkUnknown
。