首頁 > 後端開發 > C++ > 為什麼 C# 4.0 不支援協變類別?

為什麼 C# 4.0 不支援協變類別?

Linda Hamilton
發布: 2025-01-12 21:52:43
原創
895 人瀏覽過

Why Aren't Covariant Classes Supported in C# 4.0?

C# 4.0 協變類的省略:深入了解

C# 4.0 引入了介面的通用變體,支援靈活的類型參數使用。 但是,此功能並未擴展到類別。本文深入探討了這種設計選擇背後的基本原則。

實施的障礙

向類別(例如,假設的 C<T> 類別)引入協變方差帶來了重大的實施挑戰。 主要限制來自於 T 只能用作輸出參數、setter 或欄位。

這個限制是欄位缺少 getter 的直接結果。 與屬性不同,欄位不提供唯讀存取權限。 因此,協變類別不能擁有可變狀態,嚴重限制了它的實際應用。

權衡成本與效益

雖然協變不可變類(如列表和堆疊)無疑具有優勢,但在 C# 4.0 發佈時,支持它們所需的對 C# 類型系統的大量修改並不被認為是合理的。

說明不可變結構中的協方差

以下範例示範了不可變堆疊中的協方差:

<code class="language-csharp">sealed class Stack<out T>
{
    private readonly T head;
    private readonly Stack<T> tail;
}</code>
登入後複製

這允許協變分配:

<code class="language-csharp">Stack<string> strings = null;
strings = strings.Push("hello");
strings = strings.Push("goodbye");
Stack<object> objects = strings; // Covariant assignment
objects = objects.Push(123); //This would be an error if Stack<T> was mutable</code>
登入後複製

由於堆疊的不變性,因此向堆疊添加整數仍然是類型安全的。 該操作不違反類型安全。

以上是為什麼 C# 4.0 不支援協變類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板