Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#获取空合并运算符时遇到问题??工作_C# - Fatal编程技术网

c#获取空合并运算符时遇到问题??工作

c#获取空合并运算符时遇到问题??工作,c#,C#,我读过几篇关于堆栈溢出的文章和问题,但仍然看不出我做错了什么。没有使用C#6——很抱歉一开始没有发布。与2013年相比 此代码适用于: if (row.Cells["CSR_Notes"].Value != null) { deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString(); } deliver

我读过几篇关于堆栈溢出的文章和问题,但仍然看不出我做错了什么。没有使用C#6——很抱歉一开始没有发布。与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() : "";
这一准则适用于:

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…它还不能让我接受答案,但我会的。这就成功了。