Bac*_*ave 1 .net c# ienumerable casting 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 { }
Run Code Online (Sandbox Code Playgroud)
如果 anint可以隐式转换为 a long,就像 aChild可以隐式转换为 a 一样Parent,为什么转换不适用于IEnumerable<int>to IEnumerable<long>?
我一直认为协方差是有道理的,因为您正在转换一组元素,每个元素都可以单独转换为另一组元素,并且您无法向这个派生程度较低的集合添加任何新元素,这意味着转换它是安全的再次返回,因为没有机会SomeOtherChild在Parent集合中添加 say a 。
也许我错过了协方差的重点,但是如果我说的是对的,那么为什么协方差不允许从IEnumerable<int>to 进行转换IEnumerable<long>?
为了:
public class Child : Parent {...}
Run Code Online (Sandbox Code Playgroud)
一个Child对象也是一个Parent对象,不需要转换。Anint不是long; 需要转换。