MSDN提到重載=運算符是不可能的。爲可爲null的類型重載=運算符?
那麼爲什麼可以將Nullable類型分配給null?
int? i = null;
此外,我可以用我自己的泛型類型來做到這一點嗎?
MSDN提到重載=運算符是不可能的。爲可爲null的類型重載=運算符?
那麼爲什麼可以將Nullable類型分配給null?
int? i = null;
此外,我可以用我自己的泛型類型來做到這一點嗎?
Nullable
類型有特殊的編譯器支持。
無法創建用戶定義的隱式轉換到/從null
。他們將其構建到語言(和運行時)上,而不是在語言之上創建Nullable
,因爲有很多BCL類。
有趣的是,這不是Nullable
創建的唯一特殊支持。當您打開一個Nullable<T>
時,它實際上並沒有將一個Nullable
對象,有史以來。如果HasValue
爲假,則將null
裝箱,如果它是真的,則底層值將被解包並裝箱。這對你自己的類型來說是不可能的。
空類型是該結構
System.Nullable<T>.
可以指定或可爲空被指定爲通用類型可爲空的(T)的類型的實例。
更多資訊... http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx
在你的榜樣,您實際上並不設定一個int爲空,而設置在其封裝爲null的結構中的價值。
它是隱式轉換不是賦值操作符,允許指定null
:http://msdn.microsoft.com/en-us/library/ms131346(v=vs.110).aspx
如果值參數爲不爲空,新
Nullable<T>
值的Value屬性被初始化爲值參數和HasValue
屬性被初始化爲true
。如果值參數爲 空,新Nullable<T>
值的Value
屬性初始化 爲默認值,這是所有二進制0, 和HasValue
財產被初始化爲假值。
基本上是什麼蒂姆的評論(編輯:現在答案= D)說 - 有一個從null文字的隱式轉換,而不是賦值運算符的重載。
從C#language spec(I一直在尋找在5.0版) - 章節"6.1.5 Null literal conversions"
:
隱式轉換從零存在字面到任何可空 類型。該轉換會生成給定的可空類型的空值(第4.1.10節)。
它的隱式轉換不是賦值運算符http://msdn.microsoft.com/en-us/library/ms131346(v=vs.110).aspx –
@rlesias我曾發佈可空類型是一個結構體,但他也是對的 - 隱式轉換運算符是你可以重寫自己的東西,如果你真的想。 – Jay
@rlesias啊,沒問題 - 在SO上的第一篇文章總是有點雜亂 - 每個人都編輯他們的答案和評論混淆! :) – Jay