整数/长整数的IEnumerable <T>协方差

时间:2019-12-03 09:00:25

标签: c# .net casting ienumerable covariance

我有以下代码:

class Program
{
    static void Main(string[] args)
    {
        int a = 1;
        long b = a; //This works at runtime.

        IEnumerable<int> ints = new List<int> { 0, 1, 2, 3 };
        IEnumerable<long> longs = ints as IEnumerable<long>; //This returns null at runtime.

        Child child = new Child();
        Parent parent = child; //This works at runtime.

        IEnumerable<Child> children = new List<Child> { new Child() };
        IEnumerable<Parent> parents = children as IEnumerable<Parent>; //This returns non-null at runtime.
    }
}

public class Parent{ }

public class Child : Parent { }

如果可以将int隐式强制转换为long,就像可以将Child隐式强制转换为Parent一样,为什么强制转换不适用于从IEnumerable<int>IEnumerable<long>

我一直认为协方差是有道理的,因为您要将一组可以分别转换为另一组的元素转换为另一组元素,并且无法将任何新元素添加到此派生较少的集合中,这是安全的再次将其投射回去,因为没有机会在SomeOtherChild集合中添加说Parent

也许我错过了协方差的问题,但是如果我说的是正确的,那么为什么协方差不允许将IEnumerable<int>转换为IEnumerable<long>

1 个答案:

答案 0 :(得分:7)

针对:

public class Child : Parent {...}

Child对象也是Parent对象,无需转换。 int不是long;需要转换。