- 定义
逆变(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;