逆变与协变

  • 定义

    逆变(Contravariance)是指能够使用比原始指定派生类型程度更小的类型,协变(Convariance)是指能够使用比原始指定的派生类型更大(更具体的)类型。泛型类型参数支持逆变和协变。

    参考:https://msdn.microsoft.com/zh-cn/library/dd799517.aspx

  • 逆变(Contravariance)

    参数类型前带有“out”的,它可接受子类型,叫做协变(Convariance)

    

IEnumerable<string> stringList = ...;
//协变--objectList可以接受子类stringList
IEnumerable<object> objectList = stringList;
  • 协变(Convariance)

    类型参数前有“in”的,它可以接受父类型,叫做逆变(Convarance)

    

//如:IComparer<T>其定义如下
public interface IComparer<in T>
{
   //...       
}

IComparer<object> objComp ="...";
IComparer<string> stringComp = objComp;
  • 逆变和协变特性同样适用于非泛型的委托。

  

//定义一个同时相应鼠标和键盘操作的函数
prvate void MultiHandler(object sender,System.EventArgs e)
{
    if(e is KeyEventArgs)
      //do something
    if(e is MouseEventArgs)
      //..
}    

xxx.MouseClick += MultiHandler;
xxx.KeyDown += MultiHandler;
原文地址:https://www.cnblogs.com/kooleven/p/5579649.html