c#无法获得空合并运算符?上班

Joe*_*der 0 c#

我已经阅读了有关Stack Overflow的几篇文章和问题,但仍然看不出我做错了什么.不使用C#6 - 抱歉一开始没有发布.VS 2013.

此代码有效:

if (row.Cells["CSR_Notes"].Value != null)
                    {
                    deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString();
                    }
Run Code Online (Sandbox Code Playgroud)

这段代码有效:

 deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value != null 
                        ? row.Cells["CSR_Notes"].Value.ToString() : "";
Run Code Online (Sandbox Code Playgroud)

但是如果值为null,则此代码会抛出"Object reference not set ..."错误.

 deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value.ToString() ?? "";
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Jon*_*ase 5

问题是Value是潜在的null属性.通过对其调用ToString()方法,您将在空合并运算符有机会使用之前创建Null引用异常.您可以使用C#6中的Null Propagating Operation来解决这个问题,如下所示:

deliveryEvent.CSR_Notes = row.Cells["CSR_Notes"].Value?.ToString() ?? "";
Run Code Online (Sandbox Code Playgroud)

请注意?价值之后.这是Null Propagating运算符.如果Value为null,它将通过表达式的其余部分传递null,然后将正确触发Null Coalescing Operator(??).

C#5的解决方案是将合并推高一点,就像haim770的回答一样.

deliveryEvent.CSR_Notes = (rows.Cells["CSR_Notes"].Value ?? "").ToString();
Run Code Online (Sandbox Code Playgroud)