捷径& =表现得像&不是&&

时间:2015-09-04 22:34:03

标签: c#

public static void Main()
{
    var result = false;
    Xpto xpto = null;
    result &= xpto.Some;
}

public class Xpto
{
    public bool Some { get; set; }
}

我使用的是C#6.0 VS2015;上面的代码触发了一个空异常。

&=运算符的行为与&运算符类似。我希望它的行为类似于&&,如果值已经为假,则跳过对右侧的评估(参见"短路" The conditional-AND operator (&&)文章中的行为的解释)。

这种行为是故意还是错误?

1 个答案:

答案 0 :(得分:5)

查看文档:{​​{3}}:

  

x &= y   相当于x = x & y

     

(...)&运算符对积分操作数和bool操作数上的逻辑AND执行按位逻辑AND运算。

我假设您正试图避免空检查。

以下代码不会引发异常,因为您声明result变量为false;在这种情况下,语言优化将短路表达式,不会评估第二部分:

result = result && xpto.Some;

如果你是一名在线人,你可以通过写下来使其更加相同:

result = result && (xpto == null ? true : xpto.Some);

或者,在简单的C#中:

if (xpto != null)
   result = result && xpto.Some;