![](/img/trans.png)
[英]C# Custom generic struct with same compiler behavior as Nullable<T>
[英]How is Nullable<T> different from a similar custom C# struct?
在Nullable微優化(第一部分)中 ,Eric提到Nullable<T>
具有奇怪的裝箱行為 ,而這種行為無法通過類似的用戶定義類型實現。
C#語言賦予預定義的Nullable<T>
類型有哪些特殊功能? 特別是那些無法在MyNullable
類型上工作的MyNullable
。
當然, Nullable<T>
有特殊的語法糖T?
,但我的問題更多是關於語義。
我得到的是: 沒有盒裝可空的東西 。 當你裝入一個int
,你得到一個盒裝int
的引用。 當你裝一個int?
,您獲得空引用或對盒裝int
的引用。 你永遠不會得到盒裝int?
。
您可以輕松地創建自己的Optional<T>
結構,但不能實現具有該裝箱行為的結構。 Nullable<T>
的特殊行為被烘焙到運行時。
這一事實導致了許多奇怪的事情。 例如:
而且僅供參考, Nullable<T>
類型還有其他方式是“神奇的”。 例如,盡管它是結構類型,但它不滿足結構約束。 您無法創建具有該屬性的自己的結構。
我在C#規范中找到了這兩個:
is
運營商在T?
就像在T
, as
運算符可以轉換為可空類型。 現在,我認為這些功能不僅限於Nullable<T>
:
switch
的值可以是可空類型。 我認為這不重要,因為switch也接受可以在MyNullable類型上定義的用戶定義的隱式轉換。 這是我不確定的:
C#提升運營商的可空類型。 例如:
int? SumNullableInts(int? a, int? b)
{
return a + b;
}
你必須在MyNullable<T>
做很多反射工作來支持它,然后下面的代碼將編譯,它不應該:
MyNullable<List<string>.Enumerator> SumNullableEnumerators(MyNullable<List<string>.Enumerator> a, MyNullable<List<string>.Enumerator> b)
{
return a + b;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.