c# - 为什么 `bool?` 上没有解除短路运算符?

标签 c# operator-overloading short-circuiting lifted-operators

为什么不 bool?支持解除&&|| ?他们本可以解除 truefalse本来可以间接添加的运营商解除了&&|| .

运算符 |&已经解除并实现正确的Three-valued logic .但当然它们不会像||那样短路和 && .

问题是为什么他们决定在创建规范时不取消这些运算符。所以“它是这样的,因为规范是这样说的”并不能回答“为什么?”。

提升时truefalse这样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 && anythingtrue || anything会短路(falsetrue 在这两个示例中不是编译时常量)。

这与 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 上的 truefalse 运算符是有意义的。我不知道这是否是未完成的真正原因,但这对我来说很有意义。

关于c# - 为什么 `bool?` 上没有解除短路运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204366/

相关文章:

c# - 我如何测试以查看网络管道服务是否正在监听

c# - 如何在windows-mobile 5.0上通过C#代码进行冷启动和热启动?

c++ - 包含 boost::numeric::ublas::matrix 的类的运算符重载

class - Haskell 自定义数学类型和类

haskell - 如何终止在 `IO` monad 中运行的计算?

c# - 让 log4net 使用应用程序配置文件来获取配置数据

c# - 如何在运行时判断我的进程是 CPU 密集型还是 I/O 密集型

c++ - 模板中 operator++ 上未解析的外部符号

Java递归问题

c++ - 是否必须使逻辑运算符短路?和评估顺序?