首页 > 作文

图文详解C#中的协变与逆变

更新时间:2023-04-04 22:03:05 阅读: 评论:0

目录
前言协变和逆变总结

前言

这篇文章简单说2022一分一段表说c#中的协变和逆变。

在c#编程中,由于存在类型之间的强制转换,很容易会出现所谓的类型可变性说法,存在协变、逆变、不变三种。

就比如前一篇文章介绍的泛型概念,如果创建了泛型类型的实例,编译器会接受泛型类型声明以及类型参数来创建构造类型。但是在日常使用过程中,我们可能c三角函数会将派生类型分配给基类型的变量,有时候会出现错误。

这里就存在一个赋值兼容性问题。

每一个变量都有一种类型,可以将派生类对象的实例赋值给基类变量(好比之前子类声明的变量可以赋值给父类声明的变量一样)。

如下所示:

        class people        {            public int age = 27;        }         class ahuipeople : people        {         }

            people ahui = new people();            people people = new ahuipeople();             console.writeline("age:"+people.age);            console.readkey();

协变和逆变

我们按照同样的逻辑,在泛型委托中进行这种强类型的转换,会发现即使基类和派生类之间可以进行正常的转换,但是委托之间不能进行转换会出现异常错误提示。

具体如下代码所示:

        delegate t agedelegate<t>();                  static ahuipeople getage()        {            return new ahuipeople();        }

在转换过程中,委托的具体用法,但是这样子编译器提示错误。

            agedelegate<ahuipeople> ahui = geta老师节送什么礼物好ge;            agedelegate<people> people = ahui;

错误提示

这就是上面解释的那样子,基类和派生类之间可以进行转换但是委托之间未存在关联,无法进行强制类型的转换。
那么想解决这个问题就引入了协变来解决。

如果派生类只是用于输出值,那么这种结构化的委托有效性之间的常数关系叫做协变,可通过主动告知编译器我们的期望,使用out关键字标记委托声明中的类型参数。

        delegate t agedelegate<out t>();   

修改成这样子后,上面错误演示的代码编译器就可以正常编译通过了。

上面简单介绍了协变,那么接下来我们来看逆变是什么。

其实逆变就是在委托中既要声明委托类型,也要在委托方法中有实参。

这种在期望传入基类时允许传入派生对象的特性叫做逆变。 逆变使用关键字in来标记。

具体如下代码所示:

        delegate void agedelegate<in t>(t p);         static void getage(people降次公式 p)        {   董宜华         console.writeline(p.age);        }
            agedelegate<people> ahui = getage;            agedelegate<ahuipeople> people = ahui;             people(new ahuipeople());            console.writeline();            console.readkey();

输出结果

既然协变和逆变可以使用在委托上,那么接口上也可以使用,此时也需要使用out和in关键字。

总结

到此这篇关于c#中协变与逆变的文章就介绍到这了,更多相关c#协变与逆变内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 22:03:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/0bdd09dd5d68130c78b570f07ace9890.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:图文详解C#中的协变与逆变.doc

本文 PDF 下载地址:图文详解C#中的协变与逆变.pdf

标签:类型   逆变   变量   编译器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图