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() ?? "";

我错过了什么?

c#获得空合并操作符的麻烦??去工作

问题是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()