簡體   English   中英

Nullable <T>如何使用它的底層值類型擴展方法

[英]How can Nullable<T> use it's underlying value type extension method

一個小時前我問了一個問題: 如何為Enum?-Nullable<Enum>寫一個擴展方法Enum?-Nullable<Enum>
令人驚訝的是,我得到了一個答案告訴我,我可以為Enum編寫擴展方法,它可以用於所有枚舉和可以為空的枚舉。

很酷,它工作, 但如何?

如果我理解正確,所有枚舉都來自Enum所以這就是為什么我可以在每個enum中使用這個擴展方法。

但是...... ItemType? 例如,枚舉不是枚舉,它是Nullable<ItemType> ,它不是從ItemTypeEnum派生的。
就像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.

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