c#获取空合并运算符时遇到问题??工作
我读过几篇关于堆栈溢出的文章和问题,但仍然看不出我做错了什么。没有使用C#6——很抱歉一开始没有发布。与2013年相比 此代码适用于:c#获取空合并运算符时遇到问题??工作,c#,C#,我读过几篇关于堆栈溢出的文章和问题,但仍然看不出我做错了什么。没有使用C#6——很抱歉一开始没有发布。与2013年相比 此代码适用于: if (row.Cells["CSR_Notes"].Value != null) { deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString(); } deliver
if (row.Cells["CSR_Notes"].Value != null)
{
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString();
}
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value != null
? row.Cells["CSR_Notes"].Value.ToString() : "";
这一准则适用于:
if (row.Cells["CSR_Notes"].Value != null)
{
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString();
}
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value != null
? row.Cells["CSR_Notes"].Value.ToString() : "";
但如果值为null,则此代码将抛出“对象引用未设置…”错误
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString() ?? "";
我遗漏了什么?问题是值可能是空属性。通过对其调用ToString()方法,可以在使用Null合并运算符之前创建Null引用异常。您可以使用C#6中的Null传播操作修复此问题,如下所示:
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value?.ToString() ?? "";
注意到了吗?在价值之后。这是Null传播运算符。如果值为null,它将通过表达式的其余部分传递null,这将正确触发null合并运算符(??)
C#5的解决方案是将聚结推高一点,如haim770的答案所示
deliveryEvent.CSR_Notes = (rows.Cells["CSR_Notes"].Value ?? "").ToString();
问题是Value可能是null属性。通过对其调用ToString()方法,可以在使用Null合并运算符之前创建Null引用异常。您可以使用C#6中的Null传播操作修复此问题,如下所示:
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value?.ToString() ?? "";
注意到了吗?在价值之后。这是Null传播运算符。如果值为null,它将通过表达式的其余部分传递null,这将正确触发null合并运算符(??)
C#5的解决方案是将聚结推高一点,如haim770的答案所示
deliveryEvent.CSR_Notes = (rows.Cells["CSR_Notes"].Value ?? "").ToString();
您需要检查
row.Cells[“CSR\u Notes”]
对象是否为空,但您的最后一个代码段正在检查整个表达式row.Cells[“CSR\u Notes”].value.ToString()的返回值,并且在对其求值时正确抛出,因为row.Cells[“CSR\u Notes”]
返回null
请尝试以下方法:
deliveryEvent.CSR_Notes = (row.Cells["CSR_Notes"].Value ?? "").ToString();
请参见您需要检查行.Cells[“CSR\u Notes”]
对象是否为空,但您的最后一个代码片段正在检查整个表达式行.Cells[“CSR\u Notes”].value.ToString()
的返回值,并且在对其求值时正确抛出,因为行.Cells[“CSR\u Notes”]
返回null
请尝试以下方法:
deliveryEvent.CSR_Notes = (row.Cells["CSR_Notes"].Value ?? "").ToString();
请参见对空对象调用的.ToString()
。这就是您收到错误的原因。这是一个更简单的复制品:
MyObject obj = null;
string result = obj.ToString();
您可以通过使用null条件运算符(有时称为“elvis运算符”)来避免这种情况
如果值
不为空,则只会在值
上调用.ToString()
。您正在对空对象调用.ToString()
。这就是您收到错误的原因。这是一个更简单的复制品:
MyObject obj = null;
string result = obj.ToString();
您可以通过使用null条件运算符(有时称为“elvis运算符”)来避免这种情况
如果Value
不为空,这将只在Value
上调用.ToString()
。这只对C#6.0有效。是的,我想补充一个事实,它需要C#6,但错过了原始帖子中的版本。随后的编辑更正了这一点。谢谢@haim770I对不起Johathon,我也尝试过这种方法,但没有意识到它只是C#6。我仍然在使用vs2013。考虑尽快改变。我也添加了C#5解决方案。是的,这个约束是在我最初回答之后添加的。这两种解决方案都很好,如果有基于工具版本的不同解决方案,那么值得注意这些差异在哪里。空传播是一种QoL特性,有很多潜在的替代实现。这只对C#6.0有效。是的,我想补充一点,它需要C#6,但在最初的帖子中错过了版本。随后的编辑更正了这一点。谢谢@haim770I对不起Johathon,我也尝试过这种方法,但没有意识到它只是C#6。我仍然在使用vs2013。考虑尽快改变。我也添加了C#5解决方案。是的,这个约束是在我最初回答之后添加的。这两种解决方案都很好,如果有基于工具版本的不同解决方案,那么值得注意这些差异在哪里。Null传播是一种QoL特性,有很多潜在的替代实现。您仍然在Null上调用ToString()。你需要搬家吗??向内以非空值替换值(row.cells[…].Value???).ToString()
您仍然在null上调用ToString()。你需要搬家吗??向内以非空值替换值(row.cells[…].Value???).ToString()
elvis运算符通常表示?:
,在C#中,它是一个三元条件运算符。此运算符是null条件运算符或null传播运算符。elvis操作符一词在这种情况下仍然适用吗?@JonathonChase我认为它仍然被称为“elvis操作符”。我似乎在内部拒绝这种说法,但这是一种口语,所以这是我们决定的。谢谢。elvis运算符通常表示?:
,它在C#中是一个三元条件运算符。此运算符是null条件运算符或null传播运算符。elvis操作符一词在这种情况下仍然适用吗?@JonathonChase我认为它仍然被称为“elvis操作符”。我似乎在内部拒绝这种说法,但这是一种口语,所以这是我们决定的。谢谢。现在看来这很明显haim770…它还不能让我接受答案,但我会的。这就成功了。现在看来这很明显haim770…它还不能让我接受答案,但我会的。这就成功了。