带有<T>整数/长整型的 IE可数协方差



我有以下代码:

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<long>IEnumerable<int>不起作用?

我一直认为协方差是有意义的,因为您正在转换一组元素,每个元素都可以单独转换为另一组元素,并且您无法向这个派生较少的集合添加任何新元素,这意味着再次强制转换它是安全的,因为没有机会将SomeOtherChild添加到Parent集合中。

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

public class Child : Parent {...}

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

相关内容

  • 没有找到相关文章

最新更新