單獨的文字null
沒有類型,但它可以隱式轉換爲任何參考類型和任何類型的。在該表達式中:
x = null
其中x
被分配爲null時,編譯器可以很容易地從x
什麼null
文字應被轉換成可變(或字段或屬性或參數或其他)的類型推斷。例如,如果是x
string
型時,null
應代表null
參考,而如果是x
int?
型時,應null
其中HasValue
是假代表的Nullable<int>
一個實例。
如果x
的類型爲int
,則不存在隱式轉換,且上述表達式不能編譯。
(聲明var x = null;
與var
是不是因爲null
法律沒有類型本身。)
在另一方面,在表達:
someBoolean ? 42 : null /* illegal */
編譯器無法弄清楚什麼類型轉換成null
。請記住,int
既不是引用類型,也不是Nullable<>
類型。
如果你的意思是包裝成空,用途:
someBoolean ? (int?)42 : null
或:
someBoolean ? 42 : (int?)null
在這兩種情況下,編譯器會自動看到其他操作數(在另一側冒號:
)也必須隱式轉換爲int?
。
如果你的意思是拳擊到一些基類或接口int
,寫:
someBoolean ? (object)42 : null
或:
someBoolean ? 42 : (object)null
現在,上面的表述可能是子表達式中包含更大的表達式,但編譯器仍然需要表達式的類型以清除i自行宣佈。例如,在:
int? x;
x = someBoolean ? 42 : null; // still illegal!
即使子表達someBoolean ? 42 : null
出現較大的表達x = someBoolean ? 42 : null
其中x
確實有一個內部類型,子表達式必須仍然獲得它的類型「本質」。 x
的類型不能「泄漏」到子表達式上。對於許多新的C#開發人員來說,這個「語法」似乎是一個驚喜。像你這樣的問題經常被看到,例如見Nullable type issue with ?:
Conditional Operator和鏈接到它的線程。
@Akrem它清楚地說明你不需要在if-else中投入NULL,但它必須在條件運算符 –
中完成。我相信如果你在這裏添加原始問題/答案的某些部分,它會更清晰。 –