繁体   English   中英

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

[英]Why are there no lifted short-circuiting operators on `bool?`?

为什么不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
}

这会导致&&|| 表现就像他们的非短路同行一样。 除了false && anythingtrue || anything true || anything都会短路(在这两个例子中, falsetrue都没有编译时间常数)。

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

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

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


杰夫耶茨的答案显示了为什么解除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上的truefalse操作符是有意义的。 我不知道这是不是没有完成的真正原因,但对我来说是有意义的。

既然你表明提升truefalse是技术上是可行的,只有两个你的问题可能的答案(用“他们”是谁写的编译器/规格的人):

  1. 这是规范中的错误,即。 他们没有想到这一点。 (可能,但我怀疑)
  2. 他们认为解除短路操作员可能容易出错。 它可能与推理相同,因为C#完全基于类(没有C ++中的唯一函数),或者为什么像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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM