为什么&&和||不能用于可空类型?

时间:2011-05-22 22:51:26

标签: c# .net nullable

  

可能重复:
  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)
    ....

4 个答案:

答案 0 :(得分:10)

如果要返回null,则会使布尔要求无效。

|| &&

基本上,它会在bool语句中允许除null之外的值(具体地,if),这将是未定义的行为,因为if语句需要{{ 1}} ean表达。

有趣的是,这是Java和C#不同的领域之一。 Java也需要bool语句中的布尔值,但它们允许ifbool?或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;

值类型实际上变成了一个对象实例,因此不会像常规值类型一样参与布尔表达式。

更多信息:http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx