C#泛型中的逆变(in)协变(out)对于不常自定义泛型的开发来说(可能)是个很难理解的概念, 简单来说其表现形式如下
逆变(in): I = I
协变(out): I = I
上面例子中提到的 IEnumerable list = new List(); 体现的是协变, 符合一般直觉, 整体上看起来就像是将子类赋值给基类
转到 IEnumerable 的定义, 我们可以看到
public interface IEnumerable<out T> : IEnumerable
{
new IEnumerator<T> GetEnumerator();
}
复制代码
泛型 T 之前加了协变的关键词 out, 代表支持协变, 可以进行符合直觉且和谐的转化
前编中提到的代码例子不适用并且也不能改造成协变, 只适合使用逆变
相比于符合直觉且和谐的协变, 逆变是不符合直觉并且别扭的