C#6.0空合并对我来说不正常
非常简单的问题,下面的代码抛出一个“可空对象必须有值”异常。但我认为??你打算怎么办C#6.0空合并对我来说不正常,c#,C#,非常简单的问题,下面的代码抛出一个“可空对象必须有值”异常。但我认为??你打算怎么办 string qty = stop.pallets_qty_total.Value.ToString() ?? "0"; 您正在检查调用ToString()后返回的结果是否为nullstop.pallets\u qty\u total属性的Value方法,而stop.pallets\u qty\u total可能为null,也可能是stop本身为null,这也会导致代码失败 您需要使用Null Propo
string qty = stop.pallets_qty_total.Value.ToString() ?? "0";
您正在检查调用
ToString()后返回的结果是否为null
stop.pallets\u qty\u total
属性的Value
方法,而stop.pallets\u qty\u total
可能为null
,也可能是stop
本身为null
,这也会导致代码失败
您需要使用Null Propogation运算符尝试以下操作:
string qty = (stop?.pallets_qty_total?.ToString()) ?? "0";
它只会检查值是否为null,但如果前面的对象为null,则会抛出异常
string qty = stop?.pallets_qty_total?.Value.ToString() ?? "0";
您正在尝试访问Nullable
的[Value][1]
属性,但该属性未指定值。正如规范所述,它将抛出异常:
如果尚未将T类型的值指定给可为空的对象,
您可以将其与null进行比较并检索其HasValue属性,但是
无法访问其Value属性或调用其其他成员
这里有两个选项—用于在对象为null时避免访问对象属性:
string qty = stop.pallets_qty_total?.Value.ToString() ?? "0";
或者您可以记住,数值类型的默认值为零。如果未为nullable分配值,则获取默认值:
string qty = stop.pallets_qty_total.GetValueOrDefault().ToString();
这也会很小。除了Ehsan Sajjad的答案之外,假设托盘数量总量
是一个整数,这里实际上不需要第二个?
。您可以改为使用,如下所示:
string qty = stop?.pallets_qty_total.GetValueOrDefault().ToString();
如果pallets\u qty\u total
有一个值,它将返回该值。如果不是,它将返回default(T)
,在int
的情况下,它是0
,尽管注释已经给出了正确的答案,但这里有更详细的解释:
您的判断是正确的,??
运算符将在其值不为空时接受左操作数。否则将使用正确的操作数。简短版本对于以下各项至关重要:
var qty = input == null ? "0" : input;
但是,分配不会引发异常。调用ToString()
会引发异常
如果您的输入为null
,则您的语句等于以下内容:
var qty = ((object)null).ToString();
input != null ? input.ToString() : null
// is equal to
input?.ToString()
这显然会抛出一个NullReferenceException
解决方案:
您要找的是?。
操作员。这表示“如果对象不为null,则调用函数”。这将扩展为以下内容:
var qty = ((object)null).ToString();
input != null ? input.ToString() : null
// is equal to
input?.ToString()
因此,分配的解决方案应该是两个运算符的组合:
var qty = input?.ToString() ?? "0";
复制到:否,x??v
大致相当于x==null?v:x
。你是说?。
操作员吗?在这种情况下,您应该使用托盘数量总计?.ToString()??“0”
访问stop.pallets\u qty\u total.Value
已在stop.pallets\u qty\u total
为空时引发此异常-因此它甚至没有到达?
运算符。@MikhailLobanov-它被称为.Your right,谢谢。当它允许我的时候,我会接受。我知道我应该加载我在写我的答案时发布的答案。