C# 4.0 對類別中泛型變異數的限制
與介面不同,C# 4.0 不允許類別存在通用差異。 這種限制引發了一個問題:為什麼要進行限制?為類別啟用通用方差有哪些潛在的缺點?
協變類的挑戰
想像一個協變類,C<T>
。 為了實現協方差,T
需要嚴格是一種輸出類型。這意味著該類別不能具有以 T
作為輸入的方法或屬性。 同樣,T
類型的欄位將被禁止,因為它們本質上的功能類似於屬性設定器。
適用性有限:不可變結構
協變類別的唯一實際應用是不可變的結構,例如列表或堆疊。雖然不可變類別具有優勢,但這種有限的用例並不能證明原生支援不可變類別類型的協方差的相當大的開銷是合理的。
說明性範例:潛在優勢
協變Stack<T>
理論上可以允許這樣的程式碼:
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; objects = objects.Push(123);</code>
在這裡,將整數添加到字串堆疊將是類型安全的,因為不可變結構可以防止危及類型安全的操作。
總結
雖然類別的通用變異數可能會帶來一些好處,但其限制(無法使用類別類型參數作為方法或屬性輸入)超過了優點。這解釋了它在 C# 4.0 及更高版本中的缺失。
以上是為什麼 C# 4.0 不支援類別的泛型變體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!