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

C# 为什么这会引发空引用异常?,c#,nullreferenceexception,conditional-operator,C#,Nullreferenceexception,Conditional Operator,当InnerException为null时,这将引发null引用异常 String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 但这不会: String s = " inner exception: " + (e.InnerException == null ? "None" : e.InnerException.Message); 以上两种都很好。我不知道前

当InnerException为null时,这将引发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
。为什么它们不相等?

这是因为您的第一个语句正在计算
“内部异常”:+e.InnerException==null
true
false
。这都是关于运算符优先级的,这就是为什么第二个运算符由于括号(
)而工作正常的原因


。在相等
=
运算符之前对
+
运算符求值。

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

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

如果表达式包含多个运算符,则 操作员控制单个操作员的操作顺序 评估

这:

可能是这样评估的:

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

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

计算结果为
(“内部异常:”+e.InnerException)==null?
,但事实并非如此。

这就是为什么最好在不明显的情况下包含括号,这样您就不必考虑运算符优先级。
String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message;