Search code examples
.netgenericstypescovariancecontravariance

Type variance in .NET Framework 4.0


IEnumerable<T>, IComparable<T> and a few more are now type-variant. IList<T>, ICollection<T> and many others aren't. Why?


Solution

  • .NET Framework 4.0 introduces safe co/contra-variance. IList<T> and ICollection<T> have T both in input and output positions while IEnumerable<T> has T only in output positions and IComparable<T> has T only in input positions.

    Assume IList<T> supported type variance:

    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
    }