1,问题
大家可以看到定义泛型类型的可以看到out和in这两个关键字,那么具体代表什么意思呢?
2,文字解释
C# 4.0通过两个关键字:out
和in
来分别支持以协变和逆变的方式使用泛型。
- 如果某个返回的类型可以由其派生类型替换,那么这个类型就是支持协变的
- 如果某个参数类型可以由其基类替换,那么这个类型就是支持逆变的。
3,具体代码
interface IClass<T> { } interface IClassOut<out T> { } interface IClassIn<in T> { }
// 没有协变和逆变 IClass<string> str1 = null; IClass<object> object1 = null; object1 = str1; str1 = object1; // 协变 IClassOut<string> str2= null; IClassOut<object> object2 = null; object2 = str2; // 值类型不能参与协变 IClassOut<int> int2 = null; object2 = int2; // 逆变 IClassIn<string> str3 = null; IClassIn<object> object3 = null; str3 = object3; // 值类型不能参与逆变 IClass<int> int3 = null; int3 = object3; // 作用,不用自己再去做类型转换 IEnumerable<string> aryStr = new List<string>(); IEnumerable<object> aryobj = aryStr;