• 协变抗变


    >协变与抗变(逆变)

    >总说 协变就是从子类型到父类型的变化,顺着来叫着协变,如 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;

  • 相关阅读:
    vue开发(一)安装
    Ubuntu18.04安装mysql
    使用.NET Framework开发IIS 7.0模块和处理程序拦截请求实现跳转
    Mysql 清空数据后,释放硬盘文件
    依赖注入
    ubuntu 上开发.netcore
    使用python获取微医数据
    Mysql查询某字段重复值并删除重复值
    使用pyinstaller 打包python程序
    堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出
  • 原文地址:https://www.cnblogs.com/gw2010/p/3449400.html
Copyright © 2020-2023  润新知