作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我理解派生类的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
{...}
}
我知道 List
是 IEnumerable
的实现,支持索引和修改元素,但是这部分我好像没看懂?有人可以解释一下吗?谢谢。
最佳答案
因为 IEnumerable<T>
的声明is in fact :
public interface IEnumerable<out T> : IEnumerable
...和 out
位表示 T
是协变的并且接受子类型。
鉴于 List<T>
的声明没有方差注释,因此 T
是不变的。
关于c# - 如何将 List<DerivedClass> 分配给 IEnumerable<BaseClass> 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842736/
我是一名优秀的程序员,十分优秀!