【问题标题】:Type variance in .NET Framework 4.0.NET Framework 4.0 中的类型差异
【发布时间】:2010-10-30 06:42:03
【问题描述】:

IEnumerable<T>IComparable<T> 和其他一些现在是类型变体的。 IList<T>ICollection<T> 和许多其他人不是。为什么?

【问题讨论】:

    标签: .net generics types covariance contravariance


    【解决方案1】:

    .NET Framework 4.0 引入了安全 co/contra-variance。 IList<T>ICollection<T> 在输入和输出位置都具有 TIEnumerable<T> 具有 T 仅在输出位置IComparable<T> 具有 T 仅在输入位置职位

    假设IList<T> 支持的类型差异:

    static void FailingMethod(IList<object> list) {
        list[0] = 5;
    }
    
    static void Test() {
        var a = new List<string>();
        a[0] = "hello";
        FailingMethod(a); // if it was variant, this method call would be unsafe
    }
    

    【讨论】:

    • 谢谢!看起来使用索引器使任何类都没有变体。但 ICollection 仅在输入参数中有 T。
    • 不,一般来说它与索引器无关。它取决于索引器的参数和返回类型(以及 get/set 访问器的存在),就像任何其他方法或属性一样。你可能有一个像这样的索引器: T this[int index] { get { return x[index]; } } 并且没有 set 访问器,它可能是变体。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      Anders Hejlseberg 在他的演讲“C# 的未来”中进行了简短但富有启发性的讨论,描述了协变/逆变。他关于协变和逆变的讨论从演讲开始的 50 分 17 秒开始。

      http://channel9.msdn.com/pdc2008/TL16/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多