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中文網其他相關文章!