【发布时间】:2012-10-30 01:43:16
【问题描述】:
一般来说,短路or 运算符|| 会忽略右侧或左侧的计算结果为真。显然,我们发现了一个例外。
查看以下内容:
if (foo == null || bar != true ? foo.Count == 0 : true)
{
}
此代码在命令foo.Count 上引发空引用异常,因为foo 为空。当然,布尔逻辑允许这样做。但是,如果 foo 为 null,您会认为 or 会短路,甚至不会计算表达式的右侧,但它仍然会发生,并且会引发异常。
这是我的代码或 C# 编译器中的错误吗?是否有处理这种情况的 C# 规范的一部分?
【问题讨论】:
-
在使用对象时添加一些代码来设置对象(
foo和bar)可能是值得的。 -
@m1m1k 抛出了什么异常?
-
请避免在标题中出现“乞求错误”。很有可能不是编译器/语言/库。
-
这确实是一种布置条件语句的混乱方式。您应该使用括号分隔来明确描述操作的顺序 - 即使您想要默认行为。
-
我会将其重写为
if(foo == null || bar || !foo.Any()))。我觉得它比您的解决方案更容易阅读,即使在添加更多括号以使其按预期运行之后也是如此。
标签: c# .net short-circuiting