只是为了确保我没有忽略任何奇怪的边缘情况,因为我已经发现了一种可以产生它的情况,但我想确认: 是否存在任何 Delphi 版本可以发出包含 tkUnknown 作为 TTypeKind 的类型的 RTTI? 如果有: 有任何文档参考吗? 什么类型会产生它? 在当前的 Delphi XE5 RTL 中,我能找到处理 tkUnknown 的唯一地方是在TValue中,但我没有在 RTL 中找到设置包含 TypeInfo 的 TValue 的代码路径,该 TypeInfo 其中 Kind 为 tkUnknown。
答案是否定的。否则编译器就会出现错误。`tkUnknown` 表示没有可用的类型信息,这可能是不连续枚举和不从零开始的枚举(由Barry在 这里 解释),以及一些较早的类型(例如 `Real48`)。当 `TValue.IsEmpty` 为真时,`TValue.Kind` 也会返回 `tkUnknown`。(自XE2起,在它之前,它也可能在持有 nil 引用类型的情况下返回 True,这是一个错误)。当您检索不包含类型信息的内容的 RTTI(例如没有类型信息的类型的字段、属性或参数)时,您的 RTTI 信息是不完整的。在这些情况下,`TRttiField.FieldType` 和 `TRttiProperty.PropertyType` 返回 nil,并且 `TRttiMethod.GetParameters` 返回的数组是不完整的。虽然可以使用没有类型信息的类型调用 `TValue.Make`,但您将无法对其执行太多操作,因为其类型信息将为 nil。编译器显然会避免 E2134 并将 nil 传递给 `TValue.Make`。因此,`TValue.Kind` 将说 `tkUnknown`。
TTypeInfo
数据的Spring4D
部分不会出错。 - Jeroen Wiert PluimerstkUnknown
的类型:TMyEnum = (a = 1, b = 2);
- Sir RufoTypeInfo(TMyEnum)
,所以至少在XE中(现在没有更高版本可用),这甚至不会产生任何PTypeInfo。实际上,在这些情况下,RTTI是不完整的,因此具有TMyEnum字段并不具有任何TRttiType,并且具有该类型参数的方法在调用TRttiMethod.GetParameters()
时返回错误数据。 - Stefan Glienke