.net 实现IConvertible.GetTypeCode

.net 实现IConvertible.GetTypeCode,.net,.net,我知道,我在挑剔。但是,在只包含布尔值(因此只有两种状态)的结构上实现IConvertible接口时,建议从IConvertible.GetTypeCode()返回什么值?该结构是隐式可转换的,可以与布尔值进行比较,并且在除了字符串和XML表示之外的几乎所有方面,它实际上都是布尔值 如果我返回TypeCode.Boolean但是TypeCode.Object看起来不必要的模糊,我觉得我在对框架撒谎。在您自己的结构中实现此方法是否会产生任何实际后果 基于类型代码的描述。Boolean表示“表示布尔

我知道,我在挑剔。但是,在只包含布尔值(因此只有两种状态)的结构上实现IConvertible接口时,建议从
IConvertible.GetTypeCode()
返回什么值?该结构是隐式可转换的,可以与布尔值进行比较,并且在除了字符串和XML表示之外的几乎所有方面,它实际上都是布尔值

如果我返回
TypeCode.Boolean
但是
TypeCode.Object
看起来不必要的模糊,我觉得我在对框架撒谎。在您自己的结构中实现此方法是否会产生任何实际后果


基于类型代码的描述。Boolean表示“表示布尔值为true或false的简单类型”。这听起来似乎与结构的描述相符,因为您说过它只包含一个布尔值,并且可以在它们之间隐式转换。

您可以这样做,但要小心

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


实际上,大多数示例(如VB的IsNumeric例程)都会检查数字类型,因此bool类型代码可能不会影响这一点,但在其他情况下,它可能会产生影响。例如,一些orm检查类型代码以处理类型的保存和加载。如果你想让你的结构愚弄世界,让世界认为它是布尔型的,那么这可能有助于减少你的类型实际上不是布尔型的明显性。。。但是它也可能会引起一些微妙的问题。

谢谢,我也检查了Reflector,发现了一些访问它的低级方法,如System.Variant.MarshalHelperConvertObjectToVariant。我想底线是,我几乎没有理由把它宣传为布尔值,所以最好的做法似乎是只返回TypeCode.Object。这是我的建议,除非你有充分的理由不这样做。将其设置为布尔值可能会产生意外后果。