技术开发 频道

C#4.0新特性之协变与逆变

  3.C#4中的逆变

  我们继续使用Animal和Cat的例子,在VS2008中,以下的代码不能通过编译:

  代码5

delegate void THandler(T t);
  
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

0
相关文章