簡體   English   中英

為什么 C# 4.0 中的類沒有通用差異?

[英]Why isn't there generic variance for classes in C# 4.0?

如果我們有它用於接口,為什么我們也沒有它用於類? 我們在使用時會遇到什么問題?

假設您有一個在 T 中協變的類C<T> 。它的實現可能是什么樣的? T只能出去。 這意味着C<T>不能有任何采用 T 的方法、任何帶有 setter 的 T 類型屬性或任何 T 類型的字段,因為字段在邏輯上與屬性 setter 相同; T進去。

就 T 而言,您可以使用協變類構建的唯一有用的東西幾乎是不可變的。 現在,我認為擁有協變不可變列表和堆棧以及類類型之類的東西會很棒。 但是這個特性並不是很明顯,它可以清楚地證明在使類型系統本機支持協變不可變類類型方面的巨額支出是合理的。

上面的評論要求舉例說明這在哪些方面有用。 考慮以下草圖:

sealed class Stack<out T>
{
    private readonly T head;
    private readonly Stack<T> tail;
    public T Peek() { return head; }
    public Stack<T> Pop() { return tail; }
    public Stack(T head, Stack<T> tail)
    {
        this.tail = tail;
        this.head = head;
    }
}
static class StackExtensions
{
    public static Stack<T> Push<T>(this Stack<T> tail, T head) 
    {
        return new Stack<T>(head, tail);
    }
    public static bool IsEmpty<T>(this Stack<T> stack)
    {
        return stack == null;
    }
}

假設你有協變類。 現在你可以說

Stack<string> strings = null;
strings = strings.Push("hello");
strings = strings.Push("goodbye");
Stack<object> objects = strings;
objects = objects.Push(123);

嘿,我們只是將一個整數推送到一堆字符串上,但一切都很好! 沒有理由為什么這不能是類型安全的。 在可變數據結構上違反類型安全的操作可以在不可變數據結構上安全地協變。

.NET 團隊以及 C# 和 VB.NET 團隊的資源有限,他們在協變和逆變方面所做的工作解決了大部分現實世界的問題 類型系統要正確處理非常復雜——如果在其他情況下導致代碼不安全,那么在 99.9999% 的情況下工作的解決方案就不夠好。

我不認為在類方法上支持協變和逆變規范(例如“輸入”/“輸出”)的成本/時間具有足夠大的價值。 我很少能看到它們可用的情況——由於缺乏多類繼承。

您願意為 .net 再等 6 個月以獲得這種支持嗎?


另一種思考方式是在 .net 中

  • 接口/委托——用於對應用程序的概念類型系統進行建模
  • 用於實現上述類型
  • 類繼承用於在執行上述操作時減少代碼重復
  • 協變和逆變是關於應用程序的概念類型系統

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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