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