当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
。为什么它们不相同?
答案 0 :(得分:22)
这是因为您的第一条语句正在评估" inner exception: " + e.InnerException == null
为true
或false
。这完全是关于运算符优先级,这就是为什么第二个工作正常,因为括号((
和)
)。
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>