2014-02-10 21 views
1

MSDN提到重載=運算符是不可能的。爲可爲null的類型重載=運算符?

那麼爲什麼可以將Nullable類型分配給null?

int? i = null; 

此外,我可以用我自己的泛型類型來做到這一點嗎?

+1

它的隱式轉換不是賦值運算符http://msdn.microsoft.com/en-us/library/ms131346(v=vs.110).aspx –

+0

@rlesias我曾發佈可空類型是一個結構體,但他也是對的 - 隱式轉換運算符是你可以重寫自己的東西,如果你真的想。 – Jay

+0

@rlesias啊,沒問題 - 在SO上的第一篇文章總是有點雜亂 - 每個人都編輯他們的答案和評論混淆! :) – Jay

回答

1

Nullable類型有特殊的編譯器支持。

無法創建用戶定義的隱式轉換到/從null。他們將其構建到語言(和運行時)上,而不是在語言之上創建Nullable,因爲有很多BCL類。

有趣的是,這不是Nullable創建的唯一特殊支持。當您打開一個Nullable<T>時,它實際上並沒有將一個Nullable對象,有史以來。如果HasValue爲假,則將null裝箱,如果它是真的,則底層值將被解包並裝箱。這對你自己的類型來說是不可能的。

1

空類型是該結構

System.Nullable<T>. 

可以指定或可爲空被指定爲通用類型可爲空的(T)的類型的實例。

更多資訊... http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

在你的榜樣,您實際上並不設定一個int爲空,而設置在其封裝爲null的結構中的價值。

2

它是隱式轉換不是賦值操作符,允許指定nullhttp://msdn.microsoft.com/en-us/library/ms131346(v=vs.110).aspx

如果值參數爲不爲空,新 Nullable<T>值的Value屬性被初始化爲值參數和 HasValue屬性被初始化爲true。如果值參數爲 ,新Nullable<T>Value屬性初始化 爲默認值,這是所有二進制0, 和HasValue財產被初始化爲假值。

2

基本上是什麼蒂姆的評論(編輯:現在答案= D)說 - 有一個從null文字的隱式轉換,而不是賦值運算符的重載。

從C#language spec(I一直在尋找在5.0版) - 章節"6.1.5 Null literal conversions"

隱式轉換從零存在字面到任何可空 類型。該轉換會生成給定的可空類型的空值(第4.1.10節)。