[C# 4.0] 5. Covariance & Contravariance
2010-09-30 21:07:01 来源:WEB开发网这个例子虽然简单,但它很好地说明了协变的规则。受 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);
}
}
Tags:Covariance amp Contravariance
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接