为什么不bool?
支持解除&&
和||
?他们本可以解除true
andfalse
运算符,而这会间接添加解除&&
and ||
。
运算符|
和&
已经被解除并实现了正确的三值逻辑。||
但是,它们当然不会像和那样短路&&
。
问题是为什么他们决定在创建规范时不取消这些运算符。所以“就像这样,因为规范是这样说的”并不能回答“为什么?”。
举起时,true
既不是,也不是:false
null
true
false
public static bool operator true(bool? x)
{
return x.HasValue && x.Value
}
public static bool operator false(bool? x)
{
return x.HasValue && !x.Value
}
这将导致&&
和||
行为就像它们的非短路对应物一样。除了false && anything
andtrue || anything
会短路(false
并且true
在这两个示例中没有编译时间常数)。
这与MSDN 上的 DBBool 示例非常相似。
我没有看到解除这些操作员带来的令人惊讶或危险的行为。我错过了什么?
我已经阅读了另一个关于此的 SO 问题,但没有一个令人满意的答案。
true
Jeff Yates 的回答显示了为什么提升/运算符不是最佳的一个很好的理由false
,它没有解释为什么提升&&
和||
直接是不好的。由于运算符提升是特殊情况下的编译器魔法,Nullable<T>
因此它不需要遵循普通类型的重载规则,因此能够提供&&
/||
不提升true
。