为什么不bool?支持解除&&和||?他们本可以解除trueandfalse运算符,而这会间接添加解除&&and ||。
运算符|和&已经被解除并实现了正确的三值逻辑。||但是,它们当然不会像和那样短路&&。
问题是为什么他们决定在创建规范时不取消这些运算符。所以“就像这样,因为规范是这样说的”并不能回答“为什么?”。
举起时,true既不是,也不是:falsenulltruefalse
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 && anythingandtrue || anything会短路(false并且true在这两个示例中没有编译时间常数)。
这与MSDN 上的 DBBool 示例非常相似。
我没有看到解除这些操作员带来的令人惊讶或危险的行为。我错过了什么?
我已经阅读了另一个关于此的 SO 问题,但没有一个令人满意的答案。
trueJeff Yates 的回答显示了为什么提升/运算符不是最佳的一个很好的理由false,它没有解释为什么提升&&和||直接是不好的。由于运算符提升是特殊情况下的编译器魔法,Nullable<T>因此它不需要遵循普通类型的重载规则,因此能够提供&&/||不提升true。