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

[C# 4.0] 5. Covariance & Contravariance

 2010-09-30 21:07:01 来源:WEB开发网   
核心提示:看一个简单的例子,IEnumerable<string>a=newList<string>{"a","b"};IEnumerable<object>b=a;这在 4.0 以前的版本中是不允许的,[C# 4.0] 5. Covariance &a

看一个简单的例子。

IEnumerable<string> a = new List<string> { "a", "b" };
IEnumerable<object> b = a;

这在 4.0 以前的版本中是不允许的。尽管 string 继承自 object,但 IEnumerable<string> 和 IEnumerable<object> 之间并无继承关系,泛型类型与泛型参数是两码事。可在实际开发中,类似上面的转换是很常见的。

1. Covariance

泛型协变规则:

* 泛型参数受 out 关键字约束,只能用于属性或委托返回值。

* 隐式转换目标的泛型参数类型必须是当前类型的 "基类"。

out 约束示例:

interface ITest<out T>
{
  T X
  {
    get; // Allowed!
    set; // Not Allowed!
  }
  T M(T x); // Return Allowed! Parameter Not Allowed!
}

我们写一个支持协变的接口示例。

interface ITest<out T>
{
  T X { get; }
  T M();
}
class TestClass<T> : ITest<T>
  where T : Base, new()
{
  public T X { get; set; }
  public T M()
  {
    return new T();
  }
}
class Base { }
class Derived : Base { }
class Program
{
  static void Main(string[] args)
  {
    ITest<Derived> _derived = new TestClass<Derived> { X = new Derived() };
    ITest<Base> _base = _derived; // Covariance
    Base x = _base.X;
    Base m = _base.M();
  }
}

1 2 3 4 5  下一页

Tags:Covariance amp Contravariance

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