c#获得空合并操作符的麻烦??去工作
本文关键字:麻烦 工作 操作符 合并 | 更新日期: 2023-09-27 18:08:59
我已经阅读了几篇关于Stack Overflow的文章和问题,但仍然看不出我做错了什么。不使用c# 6——抱歉一开始没有发布。VS 2013 .
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() : "";
但是如果该值为空,则此代码抛出"Object reference not set…"错误。
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString() ?? "";
我错过了什么?
问题是Value是潜在的null属性。通过对其调用ToString()方法,您在空合并操作符有机会被使用之前创建了空引用异常。您可以使用c# 6中的Null传播操作来修复此问题,如下所示:
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value?.ToString() ?? "";
注意?后的值。这是空传播操作符。如果Value为null,它将通过表达式的其余部分传递null,然后将正确触发null合并操作符(??)。
c# 5的解决方案是将合并推高一点,就像haim770的答案一样。
deliveryEvent.CSR_Notes = (rows.Cells["CSR_Notes"].Value ?? "").ToString();
您需要检查row.Cells["CSR_Notes"]
对象不是null,但是您的最后一个代码片段正在检查整个表达式row.Cells["CSR_Notes"].Value.ToString()
的返回值,并且在评估它的时候它正确抛出,因为row.Cells["CSR_Notes"]
返回null
。
试试这个:
deliveryEvent.CSR_Notes = (row.Cells["CSR_Notes"].Value ?? "").ToString();
查看MSDN
你在一个null对象上调用.ToString()
。这就是你收到错误的原因。下面是一个更简单的复制:
MyObject obj = null;
string result = obj.ToString();
您可以通过使用空条件操作符(有时称为"elvis操作符")来避免这种情况
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value?.ToString() ?? "";
如果Value
不为空,则只在Value
上调用.ToString()
。