据我所知,派生类的List <>不能直接分配给基类的List <>.但是它如何允许将相同的List <>派生类分配给IEnumerable <>类型的基类参数.
public class Base
{}
public class Derived : Base
{}
public class Test
{
// inside some method...
List<Derived> someElements;
ReadElements(someElements);
public void ReadElements(List<Base> elements) // this throws compile error
{...}
public void ReadElements(IEnumerable<Base> elements) // this one works
{...}
}
Run Code Online (Sandbox Code Playgroud)
我知道这List是一个实现IEnumerable并支持索引和修改元素,但我似乎不理解这一部分?有人可以解释一下吗?谢谢.
因为声明IEnumerable<T> 实际上是:
public interface IEnumerable<out T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)
......这out意味着T协变并接受子类型.
虽然声明List<T>没有方差注释,因此T是不变的.