WEB开发网
开发学院软件开发C语言 C# 4.0: .NET Framework 4 中的新 C# 功能 阅读

C# 4.0: .NET Framework 4 中的新 C# 功能

 2010-09-30 22:47:01 来源:WEB开发网   
核心提示: 为什么将这种特性称为协变呢?通过绘制箭头,最容易看出原因,C# 4.0: .NET Framework 4 中的新 C# 功能(3),为了更形象,还是让我们使用 Manager 和 Employee 类型,实际上也确实加入成功了,本例使用 in 关键字来修饰 T,由于这两个类之间存在继承关系,从

为什么将这种特性称为协变呢?通过绘制箭头,最容易看出原因。为了更形象,还是让我们使用 Manager 和 Employee 类型。由于这两个类之间存在继承关系,从 Manager 到 Employee 之间存在隐式引用转换。

Manager → Employee

现在,由于 IEnumerable<out T> 中 T 的注释,从 IEnumerable<Manager> 到 IEnumerable<Employee> 之间也存在隐式引用转换。这就是 T 注释的目的:

IEnumerable<Manager> → IEnumerable<Employee>

这被称为协变,因为两个示例中的箭头都指向相同的方向。我们首先定义两个类型 Manager 和 Employee。然后利用这两个类型来定义新类型 IEnumerable<Manager> 和 IEnumerable<Employee>。新类型的转换方式与旧类型一样。

当这两种转换的方向相反时,即为逆变。您可能已经想到这种情况将发生在仅将类型参数 T 用作输入时,那您就对了。例如,System 命名空间包含一个名为 IComparable<T> 的接口,该接口有一个名为 CompareTo 的方法:

public interface IComparable<in T> { 
 bool CompareTo(T other); 
}

如果您有 IComparable<Employee>,则应该能够将其视为 IComparable<Manager>,因为您能做的唯一操作就是将 Employee 添加到该接口中。由于经理本身就是员工,加入经理应该是可行的,实际上也确实加入成功了。本例使用 in 关键字来修饰 T,并且以下方案能够正确执行:

IComparable<Employee> ec = GetEmployeeComparer(); 
IComparable<Manager> mc = ec;

这称为逆变,因为这次的两个箭头方向相反:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:NET Framework 功能

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接