【发布时间】:2011-07-09 10:17:54
【问题描述】:
为什么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 运算符不是最佳的,它没有解释为什么直接提升 && 和 || 是不好的。由于运算符提升是编译器的魔法,特殊情况 Nullable<T> 它不需要遵循普通类型的重载规则,因此能够在不提升 true 的情况下提供 &&/||。
【问题讨论】:
-
这不是假设 NULL 意味着 false 吗?不是每个人都会同意这一点。在例如关系理论(和 SQL)
NULL AND true , NULL and NULL, FALSE OR NULL是 .. NULL,既不是真也不是假 -
我相信会有很多无意义的答案。只有 Eric Lipper 可以给出有意义的答案,希望他能抓住问题:)
-
也许我错过了你的观点,但是,如果 x 在上面的代码中为空,那么
true(x) == false(x);。这似乎没有任何意义。 -
@Jonathan Wood 对于既不是
true也不是false的值,您期望哪个结果?它将为两者返回false。 -
@acid 我没有说 null 是
false&&true,但它可以假设这两个值。可能只是您的一个误导性表述。
标签: c# operator-overloading short-circuiting lifted-operators