我有一个简单的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;
这看起来像我想要的。再次感谢你!
答案 0 :(得分:5)
如果以下任何为null,您将收到异常:
container
container.thing
container.thing.result
我们无法判断您的情况中哪些值为null,或者null是否为有效值。你应该解决这个问题,然后修复任何给你空值的东西,或编写代码来处理这种情况。
答案 1 :(得分:4)
您需要逐步完成整个成员层次结构。
例如,如果container
为空,则您无法访问container.thing
。如果container.thing
为空,则无法访问container.thing.results
等。
仅仅捕获最后一个成员为空的情况是不够的。
答案 2 :(得分:0)
问题是container
,thing
或result
为空,而不是decode
。如果decode
为null,则??
运算符会相应地设置字符串。
??
是一个函数,它接受一些可空值和一个非空值来替换它。需要对??
运算符的整个左侧进行求值以将其传递给该函数,如果前面提到的变量之一为null,则它甚至不会那么远。