空结合运算符“??”没有捕获作为外键的数据库空值

时间:2012-04-12 18:33:13

标签: c# exception-handling null operators

我有一个简单的C#语句:

var code = container.thing.result.decode ?? "Unknown";

抛出“未将对象引用设置为对象的实例”。数据库值为null时的异常。它与非空值完美配合(到目前为止)。我试图更明确地用三元运算符重写该行:

var outcome = container.thing.result.decode == null ? "Unknown" : container.thing.result.decode;

我得到相同的结果和相同的异常(ReSharper引导我回到更简单的语句)。

我也读到了??运算符仅适用于可空类型。我正在使用的字段不是可空类型,它是nvarchar(100),也是查找表的外键。如上所述,该语句使用有效的非null值。

应用程序的ORM也有一个CODE值,用于生成CODE和DECODE对,它看起来像应该映射到查找表。

但我无法弄清楚如何处理空值。

谢谢!

编辑:谢谢您的快速回复!我确实发现了在发布后几分钟我感到困惑的地方。我认为写出问题有助于我描述问题。我更改了语句以检查引用查找表的实际字段是否为null:

var outcome = container.thing.database_code_field == null ? "Unknown" : container.thing.result.Decode;

这看起来像我想要的。再次感谢你!

3 个答案:

答案 0 :(得分:5)

如果以下任何为null,您将收到异常:

  • container
  • container.thing
  • container.thing.result

我们无法判断您的情况中哪些值为null,或者null是否为有效值。你应该解决这个问题,然后修复任何给你空值的东西,或编写代码来处理这种情况。

答案 1 :(得分:4)

您需要逐步完成整个成员层次结构。

例如,如果container为空,则您无法访问container.thing。如果container.thing为空,则无法访问container.thing.results等。

仅仅捕获最后一个成员为空的情况是不够的。

答案 2 :(得分:0)

问题是containerthingresult为空,而不是decode。如果decode为null,则??运算符会相应地设置字符串。

??是一个函数,它接受一些可空值和一个非空值来替换它。需要对??运算符的整个左侧进行求值以将其传递给该函数,如果前面提到的变量之一为null,则它甚至不会那么远。