繁体   English   中英

C#麻烦得到一个空coalescing运算符? 上班

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM