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

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

 2010-09-30 22:47:01 来源:WEB开发网   
核心提示: Manager → EmployeeIComparable<Manager> ← IComparable<Employee> 到现在为止,可以很容易地总结语言特性:在您定义类型参数时可以添加 in 或 out 关键字,C# 4.0: .NET Fram

Manager → Employee

IComparable<Manager> ← IComparable<Employee>

到现在为止,可以很容易地总结语言特性:在您定义类型参数时可以添加 in 或 out 关键字,从而为您提供额外的自由转换。不过,还是有一些限制。

首先,这种方式仅适用于泛型接口和委托。您不能以这种方式为类或结构声明泛型参数。造成这种限制的一个简单原因是:委托很像只拥有一个方法的接口,而由于字段的存在,无论如何都不能将类看作某种形式的接口。您可以将泛型类的任何字段当作既是输入又是输出,具体取决于您是对它执行写入还是读取操作。如果这些字段涉及类型参数,则这些参数既不能协变也不能逆变。

其次,如果某个接口或委托具有协变或逆变类型参数,则只有在该接口使用(而不是其定义)中,类型参数是引用类型时,才允许对该类型执行新的转换。例如,由于 int 是值类型,因此即使看起来应该能行,但是 IEnumerator<int> 事实上不能转换为 IEnumerator <object>:

IEnumerator <int>  C# 4.0: .NET Framework 4 中的新 C# 功能  IEnumerator <object>

出现这种行为的原因是转换必须保留类型的表现形式。如果允许执行 int 到 object 的转换,就不可能调用结果的 Current 属性,因为值类型 int 与对象引用在堆栈中所具有的表现形式是不一样的。但所有引用类型在堆栈中都具有相同的表现形式,因此只有在类型参数为引用类型时,才能实现这些额外的转换。

大多数 C# 开发人员很可能会开心地使用这项新的语言功能,因为在使用 .NET Framework 提供的某些类型(IEnumerable<T>、IComparable<T>、Func<T>、 Action<T> 等等)时,他们会获得更多框架类型的转换,而且编译器错误也会更少。事实上,只要设计的库包含泛型接口和委托,设计人员就可以根据需要自由使用新的 in 和 out 类型参数,使其用户能够更轻松地使用他们设计的库。

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

Tags:NET Framework 功能

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