簡體   English   中英

null和null之間沒有隱式轉換

[英]There is no implicit conversion between null and null

我有一段奇怪的代碼(永遠不會在生產代碼中使用過),它會產生奇怪的編譯錯誤,我想更多地了解這種行為,

string MyMethod(string s)
{
   return s == null ? null : null;
}

我得到的錯誤是:

無法確定條件表達式的類型,因為nullnull之間沒有隱式轉換

是什么解釋了這種行為?

是什么解釋了這種行為?

C#5規范的第7.14節:

?:運算符的第二和第三操作數x和y控制條件表達式的類型。

  • 如果x具有X類型,而y具有Y類型,則[...]
  • 如果x和y中只有一個具有類型,並且x和y都可以隱式轉換為該類型,則這就是條件表達式的類型。
  • 否則,將無法確定表達式類型,並且會發生編譯時錯誤。

您的情況是這些選項中的最后一個-表達式null沒有類型,因此xy都沒有類型,因此會出現編譯時錯誤。

您嘗試使用條件運算符表達式的結果這一事實與表達式的類型無關-編譯器按原樣從“由內而外”工作-查找表達式的類型,然后檢查您對它的用法是正確的。

在這種情況下, 沒有類型,因此編譯失敗。

在C#1中,存在一個“空類型”,它被視為null文字的類型-但是在C#3規范中刪除了該概念。 (MS沒有完整的C#2規范;它只是對C#2規范的補充。)

條件運算符需要根據第二和第三操作數的類型確定其結果的類型。 null沒有類型,因此條件運算符無法確定其值將解析為哪種類型。

我懷疑編譯器感到困惑,因為它無法確定返回的類型。 僅基於其為null的信息,它完全可以是任何引用類型。

要解決此問題,請將您的null之一或兩者都null轉換為(string)null ,它應該理解。

問題在於,由於兩個選項都不能指定類型,也不可以推斷一個,因此不能從兩個選項中推斷出條件運算符的結果。 解決方案可以是大小寫要么字符串:

string MyMethod(string s)
{
   return s == null ? (string)null : null;
}

當然,也不需要這種情況,因為它總是返回null,而可以是:

string MyMethod(string s)
{
   return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM