IEnumerable<T> 与 ints/longs 的协方差
IEnumerable<T> Covariance With ints/longs
我有以下代码:
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>
的转换?
用于:
public class Child : Parent {...}
一个Child
对象也是一个Parent
对象,不需要转换。 int
不是 long
;需要转换。
我有以下代码:
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>
的转换?
用于:
public class Child : Parent {...}
一个Child
对象也是一个Parent
对象,不需要转换。 int
不是 long
;需要转换。