委托的协变:
class Phone
        {

        }
        class Mobile : Phone
        {    

        }
        delegate Phone PhoneDele();
        class Program
        {
                static void Main(string[] args)
                {
                        Program pro = new Program();
                        PhoneDele pd1 = pro.GetPhone;
                        PhoneDele pd2 = pro.GetMobile;
                }

                public Phone GetPhone()
                {
                        return null;
                }

                public Mobile GetMobile()
                {
                        return null;
                }
        }

委托pd2的返回类型为Phone(父类),GetMobile的返回类型为Mobile(子类),将Mobile(子类)类型的返回值赋给Phone(父类),称为协变。

委托的逆变:
class Phone
        {    

        }
        class Mobile : Phone
        {    

        }
        delegate Phone PhoneDele(Mobile pho);
        class Program
        {
                static void Main(string[] args)
                {
                        Program pro = new Program();
                        PhoneDele pd1 = pro.SetPhone;
                        PhoneDele pd2 = pro.SetMobile;

                }

                public Phone SetPhone(Phone pho)
                {
                        return null;
                }

                public Mobile SetMobile(Mobile mob)
                {
                        return null;
                }
        }
pd1的参数为Mobile类型,SetPhone的参数为Phone类型。实际该句还是将子类型传递给父类型。将类型为子类型Mobile的实际参数传递给类型为父类型Phone的形参,叫做逆变。
这样,看似类型为Phone的参数,实际为Mobile,看起来像装箱。
协逆变都是把子类型赋值给父类型的过程,都符合面向对象规则。
区别在于:1协变关注与返回值,逆变关注与参数;2协变是发生在方法最后对返回值的操作,逆变是发生在方法调用中间的对参数的操作。

转载于:https://blog.51cto.com/supermaty/360510

我来分析委托的协变与逆变相关推荐

  1. .Net中委托的协变和逆变详解

    关于协变和逆变要从面向对象继承说起.继承关系是指子类和父类之间的关系:子类从父类继承所以子类的实例也就是父类的实例.比如说Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是Do ...

  2. .NET可变性解析(协变和逆变)

    [一]何为可变性 可变性是.NET4.0中的一个新特性,可变性可分为 : 协变性.逆变性.不可变性. 那么在.NET4.0之前是否有可变性? 答案是肯定的,我们可以通过下面的几个实例来简单的了解一下. ...

  3. 深入理解 C# 协变和逆变【转】

    msdn 解释如下: "协变"是指能够使用与原始指定的派生类型相比,派生程度更大的类型. "逆变"则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样 ...

  4. C#协变和逆变 - 译

    https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/covariance-contravariance/ ...

  5. C#中协变和逆变的基本概念、List和List.Select方法的命名空间

    在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反. msdn 解释如下: "协变"是指能够使用与原始指定的派生类 ...

  6. 泛型--协变与逆变(转)

    对于泛型的知识,一直比较模糊,现在有机会整理一下,突发发现C#还有很多你不知道的东东,继续.NET FrameWork中泛型的协变与逆变: 1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的 ...

  7. 对协变和逆变的简单理解

    毕业快一年了,边工作边学习,虽说对.net不算精通,但也算入门了,但一直以来对协变和逆变这个概念不是太了解,上学时候mark了一些文章,今天回过头看感觉更糊涂了,真验证本人一句口头禅"知道的 ...

  8. 深入理解 C# 协变和逆变

    msdn 解释如下: "协变"是指能够使用与原始指定的派生类型相比,派生程度更大的类型. "逆变"则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样 ...

  9. Scala入门到精通——第二十一节 类型参数(三)-协变与逆变

    本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} .当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[S] ...

最新文章

  1. 关于php插件pdo_mysql的安装
  2. python在线读-文档编辑工具Markdown
  3. NYOJ 589 糖果
  4. javascript简单介绍
  5. MFC关键技术-消息映射机制
  6. 在 Dubbo3.0 上服务治理的实践
  7. 关于 ssh-keygen 的一点疑问
  8. 关于百度地图API的地图坐标转换问题
  9. 基于Raspberry pi的BMI160驱动程序实例
  10. python中transform_Python rendering.Transform方法代码示例
  11. electron 通过nodejs的winre库实现软件开机自启动
  12. 技巧_altium中两个PCB文件合并为一个进行加工
  13. min_25 JZOJ5594 最大真因数
  14. Java中Set Map List 的区别
  15. 骨传导原理是什么?骨传导耳机的利弊
  16. python随机森林特征重要性_基于随机森林识别特征重要性(翻译)
  17. DNS中的SPF记录
  18. [生存志] 第110节 黄石公圯上授三略
  19. 手机导航精度小于1米,北斗高精度定位技术想象力不止于此
  20. 计算机专业校企合作协议,计算机专业之校企合作简论

热门文章

  1. 【C语言】【笔试题】模拟实现memcmp
  2. BER_TLV格式简介
  3. 文件结束[置顶] javaweb框架--自定义标签与freemaker结合
  4. varnish 防盗链
  5. SimpleAdapter理解
  6. 微信小程序开发实战(一)开发指南
  7. linux c++ 函数 查看,在C++ man pages中查询C++的函数
  8. FCKeditor 2.4.3精简优化带代码高亮(Dphighlighter)插件版
  9. Linux 设置端口转发
  10. Chipseq数据库的建立