首页 > 代码库 > 泛型中的协变和逆变

泛型中的协变和逆变

泛型中的协变和逆变

  协变指能够使用比原始指定的派生类型的派生程度更大的类型,逆变指能够使用比原始指定的派生类型的派生程度更小的类型。

  协变与逆变的本质就是参数的替换。逻辑不变,只进行参数的替换,以实现更高程序的复用。 

  通常,协变类型参数可用作委托的返回类型,而逆变类型参数可用作参数类型。 对于接口,协变类型参数可用作接口的方法的返回类型,而逆变类型参数可用作接口的方法的参数类型。

  

  协变是out,逆变是in。

  协变的例子:

  

  逆变的例子,When the delegate of type Action<Base> is invoked as if it were a delegate of type Action<Derived>, its argument must be of type Derived:

  

注意要点

  • 在 .NET Framework 4中,Variant 类型参数仅限于泛型接口和泛型委托类型。

  • 泛型接口或泛型委托类型可以同时具有协变和逆变类型参数。
  • 变体仅适用于引用类型;如果为 Variant 类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。
  • 变体不适用于委托组合。

参考:http://msdn.microsoft.com/zh-cn/library/dd799517(v=vs.110).aspx#DelegateVariantTypeParameters

泛型中的协变和逆变