[C# 4.0] 5. Covariance & Contravariance
2010-09-30 21:07:01 来源:WEB开发网看一个简单的例子。
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();
}
}
Tags:Covariance amp Contravariance
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接