c#中关于协变性和逆变性(又叫抗变)帮助理解

今天回忆了之前看的《深入理解C#》这本书中的泛型章节,其中对泛型的可变性的理解。泛型可变性分两种:协变和逆变。逆变也又称为抗变。

 怎么理解这两个名词的意思:

  ①:协变即为在泛型接口类型中使用out标识的类型参数。协变的字面意思是“与变化的方向相同”②逆变那就是用in来标识的泛型接口类型的类型参数。逆变的字面意思是“与变化的方向相反”

  需要注意的是无论是协变还是逆变也只能在泛型接口中来使用。

  先来举个基本的例子,来加强你对可变性的理解。在C#中有隐式类型转换,比如:


string str = "nibian";
object str1 = str;
Console.WriteLine(str1);

  

640?wx_fmt=png

  大家都知道string类型是object类型的子类型,即string->object为子->父;从子类型到父类型的转换是隐式类型转换。

举个例子:


interface IDemo<out T>
   {
       T Method(string str);
   }
   class One : IDemo<string>
   {
       public string Method(string str)
       {
           return str;
       }
   }
   class Two : IDemo<object>
   {
       public object Method(string str)
       {
           return str;
       }
   }
   class Program
   {
       static void Main(string[] args)
       {
           IDemo<string> one = new One();
           IDemo<object> two;
           two = one;
           Console.WriteLine(two.Method("2222"));
       }
   }

  

因为string是object类型的子类,在这里IDemo<string>和IDemo<object>类型之间也存在着类型转换的,从IDemo<string>向IDemo<object>进行的转换可以看成是子类型向父类型的隐式转换,它的这个用法就是协变。(这里必须要用out)

相反的我们在来看一下有关逆变的代码:


interface IDemo<in T>
   {
       string Method(T str);
   }
   class One : IDemo<string>
   {
       public string Method(string str)
       {
           return str;
       }
   }
   class Two : IDemo<object>
   {
       public string Method(object str)
       {
           return str.ToString();
       }
   }
   class Program
   {
       static void Main(string[] args)
       {
           IDemo<object> two = new Two();
           IDemo<string> one;
           one = two;
           Console.WriteLine(one.Method("2222"));
       }
   }

  同样的从IDemo<object>类型向IDemo<string>类型的转换,但是在这里我们却将父类型隐式转换为子类型的用法叫逆变。(这里必须要用in)

总结:协变和逆变就是在泛型接口类型将类型参数作为输入和输出的情况下,对类型间进行隐式转换的规律。

原文地址: https://www.cnblogs.com/yubabuneng/p/9506037.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 7.0中的解构功能---Deconstruct

解构元组C#7.0新增了诸多功能&#xff0c;其中有一项是新元组(ValueTuple)&#xff0c;它允许我们可以返回多个值&#xff0c;并且配合解构能更加方便的进行工作&#xff0c;如下面例子可以看到解构元组可以写出优雅的代码&#xff0c;并且可以使用类型推断&#xff0c;但在这里…

csp初赛复习(往年真题+解析)

排序算法 前缀/后缀表达式 二进制补码、反码 最短路 图片/音频/视频文件格式 前序/中序/后序遍历 以比较作为基本运算&#xff0c;在 N 个数中找最小数的最少运算次数为&#xff08; &#xff09;。 A. NNN B. N−1N-1N−1 C. N2N^2N2 D. logNlogNlogN 正确答案&#xff1a; B …

ASP.NET Core 2.1中基于角色的授权

授权是来描述用户能够做什么的过程。例如&#xff0c;只允许管理员用户可以在电脑上进行软件的安装以及卸载。而非管理员用户只能使用软件而不能进行软件的安装以及卸载。它是独立的而又与验证配合使用&#xff0c;需要身份验证机制。对于应用程序来说&#xff0c;首先需要进行…

CF449B Jzzhu and Cities(Dijkstra)

设每个点到1的距离为dis[x]dis[x]dis[x],特殊边为(1,vi,wi)(1,v_i,w_i)(1,vi​,wi​) 1、wi>dis[vi]w_i>dis[v_i]wi​>dis[vi​]的特殊边可以删除 2、widis[vi]且num[vi]>1w_idis[v_i]且num[v_i]>1wi​dis[vi​]且num[vi​]>1,特殊边可以删掉 思路上的偏差&…

分布式事务一致性解决方案

一、从数据一致性谈起↑一致性问题&#xff0c;“万恶之源”是数据冗余和分布并通过网络交互网络异常是常态。1、数据一致性的情形主库、从库和缓存数据一致性&#xff0c;相同数据冗余&#xff0c;关系数据库&#xff0c;为保证关据库的高可用和高性能&#xff0c;一般会采用主…

.net core 生成二维码

其实生成二维码的组件有很多种&#xff0c;如&#xff1a;QrcodeNet&#xff0c;ZKWeb.Fork.QRCoder&#xff0c;QRCoder等我选QRCoder&#xff0c;是因为小而易用、支持大并发生成请求、不依赖任何库和网络服务。既然是.net core 那当然要用依赖注入&#xff0c;通过构造函数注…

小雨坐地铁

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format:%lld 题目描述 小雨所在的城市一共有 m 条地铁线&#xff0c;分别标号为 1 号线&#xff0c;2 号线&#xff0c;……&…

计蒜客 91 地铁 HDU 5263 平衡大师(二分+网络流)

先说PPT的思路 PPT的思路源于这句话&#xff1a; 对每条边 (u, v)&#xff0c;连一条 (u, v) 容量为 1&#xff0c;费用为 1 的边。如果 流了表示删去这条边。 流过原图上的边表示删去这条边意味着什么呢&#xff1f; 令dif[u]u的出度-入度 如图&#xff0c;灰边表示原图上的…

asp.net core 外部认证多站点模式实现

PS&#xff1a;之前因为需要扩展了微信和QQ的认证&#xff0c;使得网站是可以使用QQ和微信直接登录。github 传送门 。然后有小伙伴问&#xff0c;能否让这个配置信息&#xff08;appid&#xff0c; appsecret&#xff09;按需改变&#xff0c;而不是在 ConfigureServices 里面…

如何让敏捷软着陆?

背景当前&#xff0c;敏捷已经成为了2018的热词&#xff0c;执行敏捷研发模式的项目多数都是从瀑布模型转型过来的&#xff0c;瀑布模型是一套根深蒂固的传统流程&#xff0c;如果硬着陆的话&#xff0c;很容易折翼。笔者在各类项目敏捷实施过程中&#xff0c;总结了一些接地气…

牛客网【每日一题】4月24日 子序列

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 小美有一个由n个元素组成的序列{a1,a2,a3,…,an}&#xff0c;她想知道其中有多少个子序列{ap1,ap2,…,apm}…

[AGC031E] Snuke the Phantom Thief(网络流)

考虑枚举偷的珠宝的个数k&#xff0c;且假设它们按照坐标大小排好了序&#xff08;x坐标排一次&#xff0c;y坐标排一次&#xff09;。 那么可以将条件转化一下&#xff0c; 在珠宝按x坐标排好序时&#xff0c; x坐标大于等于aia_iai​的最多取bib_ibi​个可以转化为取的前k−…

牛妹的游戏

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 UPD:数据保证不会有两条控制链控制的据点完全相同&#xff0c;也保证不会有某条控制链两端控制的据点相同…

.NET Core使用NLog通过Kafka实现日志收集

一、前言NET Core越来越受欢迎&#xff0c;因为它具有在多个平台上运行的原始.NET Framework的强大功能。Kafka正迅速成为软件行业的标准消息传递技术。这篇文章简单介绍了如何使用.NET(Core)和Kafka实现NLog的Target。在日常项目开发过程中&#xff0c;Java体系下Spring Boot …

[清华集训2017]无限之环(网络流)

很妙的一道题 对于每个格子&#xff0c;它合法与否&#xff0c;只跟它上下左右的相邻格子有关&#xff0c;所以可以想到黑白染色 &#xff08;用 (i,j) 表示 i 行 j 列的格子&#xff0c;我把 (ij) %2 0 的格子染成白色&#xff0c;把(ij)%2 1 的格子染成黑色&#xff09; …

ASP.NET Core 中的 ORM 之 Dapper

Dapper简介Dapper是.NET的一款轻量级ORM工具&#xff08;GitHub&#xff09;&#xff0c;也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。它是半自动的&#xff0c;也就是说实体类和SQL语句都要自己写&#xff0c;但它提供自动对象映射。是通过对IDbConnection接口…

用WinForm/WPF代码来为.NET Core 3.0功能投票

我们在5月报道过微软希望在.NET Core 3.0上运行WinForms和WPF。为了实现这个目标&#xff0c;他们正在构建一个新工具&#xff0c;该工具将允许你投票以决定他们需要把哪些API移植到.NET Core。但是&#xff0c;这不是一次直接进行的投票&#xff0c;而是基于你的应用程序正在使…

病毒扩散

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200429210705568.png?x-oss-processimage/waterm…

【SPFA】Party(jzoj 1328)

Party jzoj 1328 题目大意 有一个有向图&#xff0c;给你一个x&#xff0c;让你求每一个点到x再回去的最短路径&#xff0c;输出所有最短路径的最大值 输入样例 4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3输出样例 10 样例解释 数据范围 1⩽x⩽N⩽10001\le…

Asp.Net Core 2.2.0-preview1已经发布

原文地址 ASP.NET Core 2.2.0-preview1 now available今天我们很高兴地宣布,现在可以试用ASP.NET Core和.NET Core的下一个次要版本的第一个预览。在过去的几个月里&#xff0c;我们和社区里的许多人一起为这个版本进行开发&#xff0c;现在它已经准备好让更广泛的受众尝试它并…