[英]c# trouble getting a null-coalescing operator ?? to work
我已经阅读了几篇关于堆栈溢出的文章和问题,但仍然看不到我在做什么错。 没有使用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() : "";
但是,如果该值为null,则此代码将引发“未设置对象引用...”错误。
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString() ?? "";
我想念什么?
问题在于Value是可能为null的属性。 通过在其上调用ToString()方法,可以在使用空合并运算符之前创建Null Reference Exception。 您可以使用C#6中的Null传播操作来解决此问题,如下所示:
deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value?.ToString() ?? "";
注意? 价值之后。 这是Null传播运算符。 如果Value为null,它将在表达式的其余部分传递null,然后将正确触发Null合并运算符(??)。
正如haim770的回答一样,C#5解决方案是将合并工作稍微提高一点。
deliveryEvent.CSR_Notes = (rows.Cells["CSR_Notes"].Value ?? "").ToString();
您需要检查row.Cells["CSR_Notes"]
对象是否不为空,但是您的最后一个代码段是检查整个表达式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
不为null,则只会在Value
上调用.ToString()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.