为什么不 bool?
支持解除&&
和 ||
?他们本可以解除 true
和 false
本来可以间接添加的运营商解除了&&
和 ||
.
运算符 |
和 &
已经解除并实现正确的Three-valued logic .但当然它们不会像||
那样短路和 &&
.
问题是为什么他们决定在创建规范时不取消这些运算符。所以“它是这样的,因为规范是这样说的”并不能回答“为什么?”。
提升时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
和 true || anything
会短路(false
和 true
在这两个示例中不是编译时常量)。
这与 DBBool example on MSDN 非常相似.
我认为解除这些运算符不会带来令人惊讶或危险的行为。我错过了什么吗?
我已阅读 another SO question对此,但没有发现令人满意的答案。
Jeff Yates 的回答给出了解除 true
的一个很好的理由。/false
operators 不是最优的,它不能解释为什么提升 &&
和 ||
直接不好。由于运算符提升是特殊情况下的编译器魔法 Nullable<T>
它不需要遵循普通类型的重载规则,因此能够提供 &&
/||
无需提升 true
.
最佳答案
您的提议将为可空类型创建两种不同的使用模式。
考虑以下代码:
bool? a = null;
// This doesn't currently compile but would with lifted true/false operators.
if (a)
{
}
// Whereas this provides a consistent use of nullable types.
if (a ?? false)
{
}
为了保持可空类型使用的一致性,不解除 bool
上的 true
和 false
运算符是有意义的。我不知道这是否是未完成的真正原因,但这对我来说很有意义。
关于c# - 为什么 `bool?` 上没有解除短路运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204366/