一般来说, 泛型的作用就类似一个占位符, 或者说是一个参数, 可以让我们把类型像参数一样进行传递, 尽可能地复用代码。...(); 体现的是协变, 符合一般直觉, 整体上看起来就像是将子类赋值给基类
转到 IEnumerable 的定义, 我们可以看到
public interface IEnumerable...T> : IEnumerable
{
new IEnumeratorT> GetEnumerator();
}
泛型 T 之前加了协变的关键词 out, 代表支持协变, 可以进行符合直觉且和谐的转化...A: 协变的表现形式为将子类赋值给基类, 当进行输出相关操作时, 输出的对象类型为基类, 是将子类转为基类, 你可以说子类是基类;
逆变的表现形式为将基类赋值给子类, 当进行输入相关操作时, 输入的对象为子类..., 是将子类转为基类, 这个时候你也可以说基类是子类;
如果同时支持逆变协变, 若先进行子类赋值给基类的操作, 此时输出的是基类, 子类转为基类并不会有什么问题, 但进行输入操作时就是在将基类转为子类,