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)
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |