有没有任何Delphi版本可以生成包含tkUnknown的RTTI?

7

只是为了确保我没有忽略任何奇怪的边缘情况,因为我已经发现了一种可以产生它的情况,但我想确认:

是否存在任何 Delphi 版本可以发出包含 tkUnknown 作为 TTypeKind 的类型的 RTTI?

如果有:

  • 有任何文档参考吗?
  • 什么类型会产生它?

在当前的 Delphi XE5 RTL 中,我能找到处理 tkUnknown 的唯一地方是在TValue中,但我没有在 RTL 中找到设置包含 TypeInfoTValue 的代码路径,该 TypeInfo 其中 KindtkUnknown


@DavidHeffernan 我认为机会非常非常小。只是想确保一些处理TTypeInfo数据的Spring4D部分不会出错。 - Jeroen Wiert Pluimers
2
这里有一个产生 tkUnknown 的类型:TMyEnum = (a = 1, b = 2); - Sir Rufo
1
aTValue := TValue.Empty; 也会产生 tkUnknown。 - LU RD
@SirRufo 实际上,您甚至无法编译 TypeInfo(TMyEnum),所以至少在XE中(现在没有更高版本可用),这甚至不会产生任何PTypeInfo。实际上,在这些情况下,RTTI是不完整的,因此具有TMyEnum字段并不具有任何TRttiType,并且具有该类型参数的方法在调用TRttiMethod.GetParameters()时返回错误数据。 - Stefan Glienke
@LURD 当在 TValue 上调用 GetTypeKind 时,它仅在不包含任何内容的情况下返回 tkUnknown - 这在 Delphi 的早期版本中也有点问题(例如当它包含一个为 nil 的引用类型时,IsEmpty 返回 True,这导致 GetTypeKind 返回 tkUnknown 而不是正确的 TypeKind,如 tkClass 或 tkInterface)。GetTypeInfo 方法返回 nil。因此,实际上答案是否定的,没有 TypeKind = tkUnknown 的 TypeInfo。tkUnknown 实际上意味着没有可用的 TypeInfo。 - Stefan Glienke
显示剩余6条评论
1个回答

8
答案是否定的。否则编译器就会出现错误。
`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`。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接