可能重复:
AND operation cannot be applied between nullable bools.
我希望类似的行为如+或*。因此,如果任何操作数为null,则它应该返回null,但是如果它在&&中使用,则编译会抱怨或||。为什么呢?
说明要点:
//this compiles
int? x = null;
int? y = null;
var z = x*y;
// this doesn't compile
bool? x = null;
bool? y = null;
if(x && y)
....
答案 0 :(得分:10)
如果要返回null
,则会使布尔要求无效。
基本上,它会在bool
语句中允许除null
之外的值(具体地,if
),这将是未定义的行为,因为if
语句需要{{ 1}} ean表达。
有趣的是,这是Java和C#不同的领域之一。 Java也需要bool
语句中的布尔值,但它们允许if
(bool?
或Java中的Nullable<bool>
版本为Boolean
。这在运行时导致了一些意外的null
,C#正在避免这种要求。
答案 1 :(得分:2)
可能是因为&amp;&amp;和||是短路的运营商。你可以用&amp;和|与布尔?并且我相信你得到三值逻辑 - null被视为“未知”。如此虚假&amp; null是false,但是true&amp; null为null。这足以令人困惑地跟踪,而不会引发短路!面对零值,短路可能实际上没有任何用处。
编辑 - 考虑到,短路仍然对三值逻辑有意义。左侧的逻辑AND和false将始终评估为false,即使右侧为null也是如此。左侧的逻辑OR和true将始终评估为true,即使右侧为null也是如此。我想这是“不值得努力实现”功能之一。有时你需要短路的布尔逻辑。有时您需要三值布尔逻辑。但这两者很少重叠。
答案 2 :(得分:0)
即使(x&amp; y)可能,结果也会是bool?而不是布尔。 If()仅适用于bool。
尝试if(((bool)(x ?? false))&amp;&amp;(bool)(y ?? false))。
或者更好的是,跟随weebles的回答:
如果(x&amp; y == true)。
答案 3 :(得分:-3)
可空类型实际上是对象。当你应用可空运算符'?'时对于值类型(例如bool),它成为对包含“null”的对象的引用,或者是基础值类型的值。
考虑一下:
bool? isActive;
这实际上变成了:
Nullable<bool> isActive;
值类型实际上变成了一个对象实例,因此不会像常规值类型一样参与布尔表达式。