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 中,赋值操作是有效的,C# 4.0: .NET Framework 4 中的新 C# 功能(2),因为 IEnumerable<T> 以及其他几种接口均发生了变化,这种变化是由 C# 中新增的类型参数协变支持实现的,并检查接口定义中使用的 T 是否均正常(即,它们

而在 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 关键字的由来)。

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

Tags:NET Framework 功能

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