3.C#4中的逆变
我们继续使用Animal和Cat的例子,在VS2008中,以下的代码不能通过编译:
代码5
delegate void THandler(T t);
public static void TestContravariance()
{
THandler aniHandler = (ani) => { };
THandler catHandler = aniHandler;
}
public static void TestContravariance()
{
THandler aniHandler = (ani) => { };
THandler catHandler = aniHandler;
}
而在VS2010中,呃,同样不能。呵呵,其实就差一点点,这里如果在类型参数T前面加上关键字“in”,即delegate void THandler(T t);就可以实现Cat->Animal的Contravariance。
4.总结
C#4中的协变和逆变使得泛型编程时的类型转换更加自然,不过要注意的是上面所说的协变和逆变都只作用于引用类型之间,而且目前只能对泛型接口和委托使用。一个T参数只能是in或者是out,你如果即想你的委托参数逆变又想返回值协变(如代码1所示),是做不到的。
5.引用
[1] http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)
[2] http://msdn.microsoft.com/zh-cn/library/ms173174(VS.80).aspx