[英]How can Nullable<T> use it's underlying value type extension method
一個小時前我問了一個問題: 如何為Enum?-Nullable<Enum>
寫一個擴展方法Enum?-Nullable<Enum>
令人驚訝的是,我得到了一個答案告訴我,我可以為Enum
編寫擴展方法,它可以用於所有枚舉和可以為空的枚舉。
很酷,它工作, 但如何?
如果我理解正確,所有枚舉都來自Enum
所以這就是為什么我可以在每個enum中使用這個擴展方法。
但是...... ItemType?
例如,枚舉不是枚舉,它是Nullable<ItemType>
,它不是從ItemType
或Enum
派生的。
就像List<DataReader>
不是從DataReader
派生的,因此不能使用DataReader
方法,盡管DataReader
是它的Generic類型 。
我知道Nullable<T>
類型有很多“伏都教”和句法糖,這是其中之一嗎?
擴展方法不需要類/派生/,它們只需要存在轉換(更具體地說:隱式標識,引用或裝箱轉換;這是§7.6.5.2“擴展方法調用”)。
從Nullable<ItemType>
到System.Enum
的轉換是裝箱轉換; 與從Nullable<int>
到System.Object
的轉換相同。
如果您定義了自己的結構struct Test : IMyInterface {}
,則會有從Nullable<Test>
到IMyInterface
的轉換。
如果nullable為null,則來自nullables的boxing轉換將返回null引用; 並以其他方式包裝可空的值。 有關詳細信息,請參閱C#規范中的§6.1.7“Boxing conversions”。
它比編譯器魔法更具有類型系統魔力。 由於Enum
是引用類型,這意味着您傳入的任何值都將被裝箱(例如轉換為引用)。
現在, Nullable<T>
在CLR中具有特殊處理功能,如果它表示內部類型( T
)的空值或盒裝值,則它將產生wither null
,但絕不會裝箱Nullable<T>
。 當然,情況恰恰相反; 取消裝箱到可空類型接受null
引用。
擴展方法轉換為靜態方法,第一個參數是調用方法的變量。
在Enum示例中,由於Enum是一個類(不是結構),因此擴展方法可以接受枚舉的具體值(通常歸結為int)或null。 因此它適用於可空的枚舉。
同樣的事情對int不起作用? (可空)。 如果你為int創建一個擴展方法,你將無法在Nullable上調用它(它會告訴你“無法將實例參數類型Nullable轉換為int”)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.