为了匹配 Java 及支持 J#,.NET 数组总是一个协变变量。不幸的是,这样做是一种不安全的方式,在数组中存储值的时候都需要进行运行时检查。对于.NET 2 和泛型,协变和逆变变异都不能支持了。
.NET 4 将在接口和委托上支持安全的协变和逆变。为了实现这种功能,在接口上的类型应该被标记为“in”或“out”修饰符。如果标记为 out,那么接口就支持协变,并且给定的类型只能表现为一个返回类型或只读属性。如果标记为 in,那么类型只能表现为一个参数或只写属性。
这个功能只对引用类型有效,在结构上不允许变异。通过引用传递的参数同样也不允许。可被标记为支持变异的主要接口和委托有,IEnumerable、IQueryable、Func 和 Action 等。
更多关于这个功能的信息可以浏览我们的文章《在.NET 泛型中协变和逆变》以及Eric Lippert 的 Co- and contra-variance: how do I convert a List(Of Apple) into a List(Of Fruit) 。
评论