C# 4.0: .NET Framework 4 中的新 C# 功能
2010-09-30 22:47:01 来源:WEB开发网为什么将这种特性称为协变呢?通过绘制箭头,最容易看出原因。为了更形象,还是让我们使用 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;
这称为逆变,因为这次的两个箭头方向相反:
- ››功能强更实用 Win7库变为“计算机”
- ››功能最全!网管必备子网划分计算工具!
- ››Netpas加速 让非电信宽带用户流畅上网
- ››net中fckediter的图片上传时候点击\浏览服务器\出...
- ››Netmsg局域网聊天程序
- ››NetAirus指控苹果iPhone侵犯其专利
- ››Netflix 在线影视播放程序将登陆 iPhone
- ››Net中各种不同的对象创建方式的速度差异
- ››NetNewsWire 功能简单 界面快速 Reader 浏览器
- ››功能完整的 Google Reader 离线浏览器 Byline 介绍...
- ››NET-使用Js调用WebService
- ››Net 应用程序如何在32位操作系统下申请超过2G的内...
更多精彩
赞助商链接