【问题标题】:Why does this statement throw a null reference exception?为什么这个语句会抛出空引用异常?
【发布时间】:2012-01-09 03:16:11
【问题描述】:

这将在 InnerException 为空时抛出空引用异常。

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

【问题讨论】:

    标签: c# nullreferenceexception conditional-operator


    【解决方案1】:

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

    See this reference for Operator Precedence+ 运算符在相等 == 运算符之前计算。

    【讨论】:

    • 这就是为什么最好在非显而易见的情况下包含括号,这样您就不必考虑运算符的优先级。
    【解决方案2】:

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

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

    Operator precedence and associativity

    当一个表达式包含多个运算符时, 运算符控制各个运算符的顺序 评估。

    【讨论】:

      【解决方案3】:

      这个:

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

      大概是这样评价的:

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

      【讨论】:

        【解决方案4】:

        操作顺序:

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

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

        【讨论】:

          猜你喜欢
          • 2022-01-05
          • 1970-01-01
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-24
          相关资源
          最近更新 更多