[英]Why are there no lifted short-circuiting operators on `bool?`?
为什么不bool?
支持解除了&&
和||
? 他们可以举起true
和false
这将间接地加入解除运营商&&
和||
。
运营商|
和&
已经解除并实施正确的三值逻辑 。 但当然它们不像||
那样短路 和&&
。
问题是为什么他们在创建规范时决定不提升这些操作符。 所以“就像这样,因为规范说的如此”对“为什么?”没有答案。
当提升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
true || anything
都会短路(在这两个例子中, false
和true
都没有编译时间常数)。
我认为解除这些操作员并不会引起任何令人惊讶或危险的行为。 我错过了什么?
我已经阅读了另一个关于此的问题 ,但没有找到令人满意的答案。
杰夫耶茨的答案显示了为什么解除true
/ false
运算符不是最优的一个很好的理由,它没有解释为什么提升&&
和||
直接坏了。 由于运算符提升是编译器魔术,特殊情况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
操作符是有意义的。 我不知道这是不是没有完成的真正原因,但对我来说是有意义的。
既然你表明提升true
和false
是技术上是可行的,只有两个你的问题可能的答案(用“他们”是谁写的编译器/规格的人):
if (myNullVar) { ... }
( myNullVar
是引用)这样的语句在C#中不起作用(但它在C / C ++中)。 我认为在使编程语言更强大并使其更不容易出错之间总是存在平衡。
更新:只是为了您的兴趣,这就是官方文档所说的:
这是不允许的,因为不清楚null在条件的上下文中意味着什么。
false && anything
都与false
相同。 但是,如果你false && anything
只有在anything
是假的时候才是真的那么!anything
那就是你想要的!anything
。
另外, true || anything
true || anything
都和true
。 ......而且我不确定你怎么能在任何情况下让它返回假,因为没有任何意义让“这个或那个”什么都不返回!
...为什么在条件清晰简单的情况下为条件增加额外的重量?
我通常不熟悉“因为这是如此”,但我没有看到添加此类功能的优势。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.