实现IConvertible.GetTypeCode

Jos*_*osh 10 .net

我知道,我在挑剔.但是当在仅包含布尔值(因此只有两个状态)的结构上实现IConvertible接口时,建议的返回值是IConvertible.GetTypeCode()多少?该结构是可隐式转换的,与布尔值相当,除了字符串和XML表示之外几乎所有方面,它实际上都是一个布尔值.

如果我回来的话,我觉得我对框架撒谎,TypeCode.BooleanTypeCode.Object似乎不必要地含糊不清.在您自己的结构中实现此方法有任何实际后果吗?

MSDN上的IConvertible.GetTypeCode

Ree*_*sey 4

你可以这样做——但要小心。

许多例程直接使用 GetTypeCode,如果您的结构传递给其中之一,这可能会产生影响。如果您重写 GetTypeCode 以返回 TypeCode.Boolean,这些例程将假定您的结构是 bool,这可能会或可能不会产生奇怪的副作用。

实际上,大多数示例(例如 VB 的 IsNumeric 例程)都会检查数字类型,因此 bool TypeCode 可能不会影响这一点,但在其他情况下它可能会产生影响。例如,某些 ORM 检查类型代码来处理类型的保存和加载。如果您希望您的结构欺骗世界,使其认为它是布尔值,这可能有助于使您的类型实际上不是布尔值这一事实变得不那么明显......但它也可能会导致微妙的问题。

  • 谢谢,我也检查了 Reflector,发现了一些访问它的低级方法,例如 System.Variant.MarshalHelperConvertObjectToVariant。我想最重要的是,我几乎没有理由将其宣传为布尔值,因此最好的做法似乎是只返回 TypeCode.Object。 (3认同)