簡體   English   中英

Nullable怎么樣? <T> 與類似的自定義C#結構不同?

[英]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? 就像在Tas運算符可以轉換為可空類型。
  • 對非可空值類型進行操作的預定義和用戶定義的運算符被提升為這些類型的可空形式。

現在,我認為這些功能不僅限於Nullable<T>

  • switch的值可以是可空類型。 我認為這不重要,因為switch也接受可以在MyNullable類型上定義的用戶定義的隱式轉換。
  • 支持Nullable IDisposable類型,在生成對Dispose()的調用之前插入空檢查。 我不認為這很重要,因為我可以將MyNullable定義為一個類,然后它將是相同的。

這是我不確定的:

  • 規范提到了裝箱/拆箱和隱式/顯式轉換,但我不明白使用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.

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