Boolean或包含三元条件运算不会发生短路

m1m*_*m1k -1 .net c# short-circuiting

通常,短路or操作符||忽略右侧或左侧评估为真.显然,我们发现了一个例外.

请查看以下内容:

if (foo == null || bar != true ? foo.Count == 0 : true)
{

}
Run Code Online (Sandbox Code Playgroud)

此代码在命令上抛出空引用异常,foo.Count因为它foo为null.当然,布尔逻辑允许这样做.但是,如果foo为null,你会期望它or会短路,甚至不评估表达式的右侧,但它仍然会这样做,并且它会引发异常.

这是我的代码或C#编译器中的错误吗?是否有一部分C#规范可以处理这种情况?

Jus*_*ner 17

那是因为你的陈述没有像你期望的那样被评估.

你需要一些额外的括号:

if(foo == null || (bar != true ? foo.Count == 0 : true))
Run Code Online (Sandbox Code Playgroud)

现在写的方式相当于(由于运算符优先级):

if((foo == null || bar != true) ? foo.Count == 0 : true)    
Run Code Online (Sandbox Code Playgroud)


Zbi*_*iew 11

不,它工作正常,请参考运算符优先级.||将在之前进行评估?:

所以它首先评估foo == null || bar != true然后? foo.Count == 0 : true,所以它更像是:

if ((foo == null || bar != true) ? foo.Count == 0 : true)
{

}
Run Code Online (Sandbox Code Playgroud)

如果你想在这里使用short-circut那么应该是:

if (foo == null || (bar != true ? foo.Count == 0 : true))
{

}
Run Code Online (Sandbox Code Playgroud)