C# 4.0: .NET Framework 4 中的新 C# 功能
2010-09-30 22:47:01 来源:WEB开发网而在 C# 4.0 中,赋值操作是有效的,因为 IEnumerable<T> 以及其他几种接口均发生了变化,这种变化是由 C# 中新增的类型参数协变支持实现的。
IEnumerable<T> 比任意 IFoo<T> 更加特殊,因为尽管初看起来并不明显,但是使用类型参数 T 的成员(IEnumerable<T> 中的 GetEnumerator 和 IEnumerator<T> 中的 Current 属性)实际上仅在返回值的位置使用 T。因此,您只能从序列中获取 Manager,而绝不能向其中放入 Manager。
相比之下,让我们看看 List<T>。由于以下原因,用 List<Manager> 来替代 List<Employee> 将是一场灾难:
List<Manager> ms = GetManagers();
List<Employee> es = ms; // Suppose this were possible
es.Add(new EmployeeWhoIsNotAManager()); // Uh oh
正如这段代码所示,如果您认为您是在查看 List<Employee>,那您就可以插入任何员工。但实际上正在操作的列表是 List<Manager>,因此插入非 Manager 的员工一定会失败。如果允许这种操作,就会失去类型安全性。List<T> 不能对 T 进行协变。
而 C# 4.0 中有一项新的语言功能,允许定义一些类型(例如新的 IEnumerable<T>),只要正在处理的类型参数之间存在一定的关系,就允许在这些类型参数之间进行转换。.NET Framework 开发人员编写 IEnumerable<T> 时就使用了这项特性,他们的代码类似于下面的代码(当然经过了简化):
public interface IEnumerable<out T> { /* ... */ }
请注意修饰类型参数 T 的定义的 out 关键字。当编译器遇到此关键字时,会将 T 标记为协变,并检查接口定义中使用的 T 是否均正常(即,它们是否仅在输出位置使用,这也就是 out 关键字的由来)。
- ››功能强更实用 Win7库变为“计算机”
- ››功能最全!网管必备子网划分计算工具!
- ››Netpas加速 让非电信宽带用户流畅上网
- ››net中fckediter的图片上传时候点击\浏览服务器\出...
- ››Netmsg局域网聊天程序
- ››NetAirus指控苹果iPhone侵犯其专利
- ››Netflix 在线影视播放程序将登陆 iPhone
- ››Net中各种不同的对象创建方式的速度差异
- ››NetNewsWire 功能简单 界面快速 Reader 浏览器
- ››功能完整的 Google Reader 离线浏览器 Byline 介绍...
- ››NET-使用Js调用WebService
- ››Net 应用程序如何在32位操作系统下申请超过2G的内...
更多精彩
赞助商链接