C# 基础知识系列 专题九: 深入理解泛型可变性
最后更新于:2022-04-02 00:09:39
# [C# 基础知识系列]专题九: 深入理解泛型可变性
**引言:**
在C# 2.0中泛型并不支持可变性的(可变性指的就是协变性和逆变性),我们知道在面向对象的继承中就具有可变性,当方法声明返回类型为Stream,我们可以在实现中返回一个FileStream的类型,此时就存在一个隐式的转化——从**FileStream类型(子类引用)——>Stream类型(父类引用),**并且引用类型的数组也存在这种从**子类引用——>父类引用**的转化,例如string[] 可以转化为object[](即这样的代码是可以通过编译的:string[] strs =new string[3]; object[] objs =strs;),此时我们肯定会想是否泛型中的泛型参数也可以支持这样的转化呢?然而在C# 2.0中是不支持的,但是就是因为有这样的需求,所以微软也考虑到这个问题的, 所以在C# 4.0中就引入了泛型的协变和逆变性。下面就具体来介绍下C# 4.0 中对协变和逆变的具体内容有哪些的。
**一、协变性**
协变性指的是——泛型类型参数可以从一个**派生类隐式转化为基类(大家可以这样记忆的,协变性即和谐的变化,生活中我们一般会说子女长的像他们的父母,这样听起来会感觉比较和谐点,这样就很容易记住协变了)**,在C#4.0中引入**out**关键字来标记泛型参数支持协变性。为了更好的说明泛型的协变性,下面就以.Net类库的中**public interface IEnumerable<out T>**这个接口来演示一个例子来帮助大家理解泛型协变:
```
List
';