如何将List <DerivedClass>分配给IEnumerable <BaseClass>参数?

MNI*_*NIK 4 c# list

据我所知,派生类的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并支持索引和修改元素,但我似乎不理解这一部分?有人可以解释一下吗?谢谢.

Cra*_*ntz 7

因为声明IEnumerable<T> 实际上是:

public interface IEnumerable<out T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)

......这out意味着T协变并接受子类型.

虽然声明List<T>没有方差注释,因此T是不变的.