繁体   English   中英

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

[英]Why does this throw a null reference exception?

当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 为什么它们不相同?

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

有关操作员优先顺序,请参阅此参考 在等于==运算符之前计算+运算符。

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

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

运算符优先级和关联性

当表达式包含多个运算符时,运算符的优先级控制各个运算符的计算顺序。

这个:

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;

被评估为(" inner exception: " + e.InnerException) == null ? 它不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM