为什么这会引发空引用异常?

时间:2011-11-29 19:30:07

标签: c# nullreferenceexception conditional-operator

当InnerException为null时,这将抛出一个空引用异常。

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message;

但这不会:

String s = " inner exception: " + (e.InnerException == null ? "None" : e.InnerException.Message);

上述两种构建都很好。我无法弄清楚前者试图做什么会导致它评估e.InnerException.Message。为什么它们不相同?

4 个答案:

答案 0 :(得分:22)

这是因为您的第一条语句正在评估" inner exception: " + e.InnerException == nulltruefalse。这完全是关于运算符优先级,这就是为什么第二个工作正常,因为括号(())。

See this reference for Operator Precedence+运算符在等于==运算符之前进行求值。

答案 1 :(得分:4)

这是由于运算符优先级,在这种情况下+运算符的优先级高于==运算符,因此您需要使用括号来覆盖默认的优先顺序,以便代码在正确的顺序。

您可以在C#语言规范中阅读所有相关内容:

Operator precedence and associativity

  

当表达式包含多个运算符时,优先级为   运营商控制各个运营商的顺序   评价。

答案 2 :(得分:3)

此:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message;

可能会像这样评估:

String s = (" inner exception: " + e.InnerException) == null ? "None" : e.InnerException.Message;

答案 3 :(得分:2)

操作顺序:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message;

评估为(" inner exception: " + e.InnerException) == null ?,而不是。{/ p>