C#特性聚焦:协变和逆变

为了匹配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)。

查看英文原文:C# Feature Focus: Co- and Contra-variance

你可能感兴趣的:(C#特性聚焦:协变和逆变)