2012-11-09 43 views
-1

通常,短路or运算符||忽略或右侧的或如果左侧评估为真。显然,我们发现了一个例外。布尔或包含三元条件运算不会被短路

检查了以下工作:

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

} 

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

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

+3

当您使用它们时,可能需要添加一些代码来设置对象('foo'和'bar')。 –

+0

@ m1m1k抛出什么异常? –

+0

@GeorgeStocker'这段代码在命令foo.Count上抛出一个空引用异常' –

回答

17

这是因为您的声明没有按照您的预期进行评估。

你需要一些额外的括号:

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

它现在编写方式等同于(由于运算符优先级):

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

不,它工作正常,请参阅operator precedence。前?:

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

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

} 

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

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

} 
3

想象一下您正在检查的状况的括号:

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

} 

因此,如果foonull,那么您试图阅读foo.Count,这自然会导致NullReferenceException

相关问题