WEB开发网
开发学院软件开发C语言 [C# 4.0] 5. Covariance & Contravariance 阅读

[C# 4.0] 5. Covariance & Contravariance

 2010-09-30 21:07:01 来源:WEB开发网   
核心提示: 这个例子虽然简单,但它很好地说明了协变的规则,[C# 4.0] 5. Covariance & Contravariance(2),受 out 约束,泛型参数只能用于返回值,namespaceSystem.Collections.Generic{//Summary://Exposesth

这个例子虽然简单,但它很好地说明了协变的规则。受 out 约束,泛型参数只能用于返回值,而这些派生类型(Derived)的返回值总是能隐式转换为基类型(Base),因此上面例子协变隐式装换后,再访问属性 X 和 方法 M 是不会存在任何问题的。

.NET 4.0 Framework 已经对很多泛型集合接口做了协变处理,包括 IEnumerable<T>, IEnumerator<T>, IQueryable<T>, IGrouping<TKey, TElement> 等。

namespace System.Collections.Generic
{
  // Summary:
  //   Exposes the enumerator, which supports a simple iteration over a collection
  //   of a specified type.
  //
  // Type parameters:
  //   T:
  //     The type of objects to enumerate.This type parameter is covariant. That is,
  //     you can use either the type you specified or any type that is more derived.
  //     For more information about covariance and contravariance, see Covariance
  //     and Contravariance in Generics.
  public interface IEnumerable<out T> : IEnumerable
  {
    IEnumerator<T> GetEnumerator();
  }
}

如此,我们才有了本文刚开始的那个集合的隐式转换演示。我们给一个泛型委托协变的示例。

class Base
{
  public int X { get; set; }
}
class Derived : Base
{
}
delegate T TestHandler<out T>(int x);
class Program
{
  static void Main(string[] args)
  {
    TestHandler<Derived> _derived = (x) => new Derived { X = x };
    TestHandler<Base> _base = _derived; // Covariance
    Base o = _base(123);
  }
}

上一页  1 2 3 4 5  下一页

Tags:Covariance amp Contravariance

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