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 (&&)文章中的行为的解释)。
这种行为是故意还是错误?
答案 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;