【问题标题】:Why doesn't this ?: operator return null?为什么 this ?: 运算符不返回 null?
【发布时间】:2012-08-23 12:43:38
【问题描述】:

我编写了这行代码来处理空值,但是当我在 expectedItem 为空时运行这行代码时,我仍然会收到“对象引用未设置为对象的实例”错误。是什么赋予了?写这个的正确方法是什么? 由于expectedItem 为null,我希望expectedItem.ExpectedResultAmount 也为null,因此该语句应为x 分配一个空字符串。

string x = expectedItem.ExpectedResultAmount != null ? expectedItem.ExpectedResultAmount : "";

【问题讨论】:

    标签: c# null operators conditional-statements


    【解决方案1】:

    你需要检查expectedItem是否不为空,而不是它的属性

    string x = expectedItem != null ? expectedItem.ExpectedResultAmount : "";
    

    【讨论】:

    • 操作是否不应该同时检查对象实例及其属性?看我的回答。
    • @activwerx:如果他们应该这样做 - 他们很快就会发现 ;-) 犯错是最好的学习方式
    【解决方案2】:

    您应该检查对象实例 (expectedItem) 和属性 (expectedItem.ExpectedResultAmount),因为两者都可能失败:

    string x = expectedItem != null && expectedItem.ExpectedResultAmount != null ? expectedItem.ExpectedResultAmount : "";
    

    【讨论】:

    • 我选择这个是因为它会检查对象及其属性,我喜欢这种语法风格
    • 真的吗?我发现阅读多个嵌套的三元运算符很难。
    • @FlavorScape,我同意,但我以与问题中发布的 OP 相同的方式编写它。
    • @FlavorScape,您会使用答案中的哪些样式,或者您有特定的样式要分享?提前致谢
    • @activwerx 您会使用答案中的哪些样式,或者您有特定的样式要分享?提前致谢
    【解决方案3】:

    你的期望是错误的。试试

    string x = expectedItem == null ? "" : expectedItem.ExpectedResultAmount != null ? expectedItem.ExpectedResultAmount : "";
    

    【讨论】:

    • +1 与所选答案相同,您领先几分钟
    【解决方案4】:

    expcetedItem 无疑是 null:

    string x;
    
    if (expectedItem != null)
        x = expectedItem.ExpectedResultAmount != null ? expectedItem.ExpectedResultAmount : "";
    

    【讨论】:

      【解决方案5】:

      简短的回答:您取消引用 expectedItem 因为您正在检查 expectedItem.ExpectedResultAmount 是否为 null 而不是检查 expectedItem 本身。你应该写

      string x = expectedItem != null ? expectedItem.ExpectedResultAmount : "";
      

      【讨论】:

        【解决方案6】:

        expectedItem 为空。

        if( expectedItem != null)
          x = expectedItem.ExpectedResultAmount != null ? expectedItem.ExpectedResultAmount : "";
        else 
          x = "poop";
        

        【讨论】:

        • 你不能在 C# 中说if (expecteditem);您必须明确地将其与 null 进行比较。
        【解决方案7】:

        试试这个

        string x = expectedItem != null && expectedItem.ExpectedResultAmount != null
            ? expectedItem.ExpectedResultAmount
            : string.Empty;
        

        【讨论】:

          【解决方案8】:

          编写代码的正确方法如下:

          string x = expectedItem != null ? (expectedItem.ExpectedResultAmount != null ? expectedItem.ExpectedResultAmount : "") : "";
          

          你首先必须确保expectedItem 不为null,如果是,你将有一个非法操作称为null pointer;然后,您应该为 x 分配一个空字符串。

          如果不为null,你就这样写

          string x = expectedItem != null ? expectedItem.ExpectedResultAmount : "";
          

          x 可以为 null 或 expectedItem.ExpectedResultAmount,如果您不希望 x 为 null,例如,您可以稍后对其进行字符串操作,例如作为 Compare 或 Concat,您还应确保其成员 ExpectedResultAmount 也不为空。

          【讨论】:

            【解决方案9】:

            因为有人建议接受的答案是“不容易看”,你也可以考虑这个:

            string x = ""; //string is empty...
            if (expectedItem != null && expectedItem.ExpectedResultAmount != null)
            {
                x = expectedItem.ExpectedResultAmount; //...unless this exists.
            }
            

            【讨论】:

            • 它可能是一个 5 行(与我的 1 行相反)的解决方案,但它非常容易阅读!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-17
            相关资源
            最近更新 更多