为什么"bool?"上没有解除短路操作符?

Cod*_*aos 18 c# operator-overloading short-circuiting lifted-operators

为什么不bool?支持解除&&||?他们本可以提升truefalse操作员,这些操作员会间接地增加&&和提升||.

运营商|&已取消和落实正确的三值逻辑.但当然,他们并没有像||和那样短路&&.

问题是为什么他们在创建规范时决定不提升这些操作符.所以"就像这样,因为规范说的如此"对"为什么?"没有答案.

当抬起truefalsenull既不是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
}
Run Code Online (Sandbox Code Playgroud)

这将产生&&||表现就像他们的非短路对应物.不同之处在于false && anythingtrue || anything将短路(falsetrue在这两个例子中没有编译时间常数).

这与MSDN上DBBool示例非常相似.

我认为解除这些操作员并不会引起任何令人惊讶或危险的行为.我错过了什么?

我已经阅读了另一个关于此的问题,但没有找到令人满意的答案.


杰夫耶茨的答案显示了为什么提升true/ false运算符不是最优的一个很好的理由,它没有解释为什么提升&&||直接坏.由于操作员提升是编译器魔术,在特殊情况下,Nullable<T>它不需要遵循正常类型的重载规则,因此能够提供&&/ ||不提升true.

Yan*_*hon 0

false && anything是相同的false。然而,如果你期望false && anything只有当anything,那么这!anything就是您想要的。

还,true || anything与 相同true。...而且我不确定如何让它在任何条件下返回 false,因为让“这个或那个”什么都不返回是没有意义的!

...既然条件如此简单明了,为什么还要增加额外的权重呢?

我通常不擅长“因为就是这样”,但我看不到添加此类功能的优势。

  • 哦!那么,您正在谈论“cond1 &amp;&amp; cond2”,而您希望即使“cond1”为 false 也能评估“cond2”? (2认同)