>协变与抗变(逆变)
>总说 协变就是从子类型到父类型的变化,顺着来叫着协变,如 Shape s=new Rectangle();
抗变就是从类型到子类型的变化,逆着来叫抗变,这种情况的例子很少
>委托中的协变和抗变 可以用一句语来说明 在委托中返回类型支持协变的,参数类型是支持抗变
的。
比如 delegate Shape D(); //要返回Shape的方法才能接受 //但是因为委托返回类型支持协变,所以 Rectangle Foo(){}
D d=Foo;//这样是可以,因为返回值是协变的 可以参考Shape s=new
Rectangle();
//下面看参数类型支持抗变 delegate void D(Rectangle r); //安理这里要接受Rectangle类型的方法
才行,但是因为委托参数支持抗变,所以 void Foo(Shape s){}
D d=Foo; //这样也是可以的。
>再看泛型接口中的协变坑变 在有了前说明的基础上就好理解这个了,刚才说了委托返回值是协变的,
参数是抗变的。所以泛型接口定义中out,in两个关键字来支持协变和抗变。 比如 public interface IX<out T>{} 这个接口是支持协变的 那么 我们可以这样用 IX<Rectangle> bbb=new X<Rectangle>(); IX<Shape> aaa=bbb;//协变
public interface IX<in T>{} 这个接口是支持抗变的 那么 IX<Shape> bbb=new X<Shape>(); IX<Rectangle> aaa=bbb;//抗变
>还有一部分是泛型委托中的协变抗变 同理 public delegate T D<out T>();这个是协变的 public delegate void D<in T>();这个是抗变的 所以 D<Rectangle> b=xxx; D<Shape> a=b; 下面个可以 D<Shape> b=xxx; D<Rectangle> a=b;
其实大体分成两类,一类是委托的协变和逆变 一类是泛型的协变和抗变,泛协里面就是接口和委托泛型 微软恰恰把泛型这一部分叫协变和抗变,把委托的叫协变和逆变,难道这是
区分一下?不过这样子读也恰好简单的分类一下吧。
-----------------------
又改动了一下,之前理解有误啊,现在不知道正确否,如果有大神看见不对的地方望指正。
-----------------------------------------------------
[2017-06-14]
返回值协变,参数抗变 分别用out in;