C# 为什么这会引发空引用异常?
当InnerException为null时,这将引发null引用异常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); 以上两种都很好。我不知道前
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;