c#中关于协变性和逆变性(又叫抗变)帮助理解
今天回忆了之前看的《深入理解C#》这本书中的泛型章节,其中对泛型的可变性的理解。泛型可变性分两种:协变和逆变。逆变也又称为抗变。
怎么理解这两个名词的意思:
①:协变即为在泛型接口类型中使用out标识的类型参数。协变的字面意思是“与变化的方向相同”②逆变那就是用in来标识的泛型接口类型的类型参数。逆变的字面意思是“与变化的方向相反”
需要注意的是无论是协变还是逆变也只能在泛型接口中来使用。
先来举个基本的例子,来加强你对可变性的理解。在C#中有隐式类型转换,比如:
string str = "nibian" ;
object str1 = str;
Console.WriteLine(str1);
|
大家都知道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
c#中关于协变性和逆变性(又叫抗变)帮助理解相关推荐
- java 协变性_Java 泛型 协变性、逆变性
Java 泛型 协变性.逆变性 @author ixenos 摘要:协变性.协变通配符.协变数组.协变返回值 协变性.逆变性和无关性 在面向对象的计算机程序语言中,经常涉及到类型之间的转换,例如从具体 ...
- 如何理解通配符类型参数/协变性/逆变性?
如何理解通配符类型参数/协变性/逆变性? Java的Collection接口中,addAll方法的方法签名为什么不是 void addAll(Collection<E> items) ,而 ...
- Java 泛型的不变性 (invariance)、协变性 (covariance)、逆变性 (contravariance)
本文整理自:https://chiclaim.blog.csdn.net/article/details/85575213 我们先定义三个类:Plate.Food.Fruit //定义一个`盘子`类 ...
- C语言学习之将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1. 要求改为1,4,5,6,8。
将一个数组中的值按逆序重新存放.例如,原来顺序为8,6,5,4,1. 要求改为1,4,5,6,8. #include <stdio.h> #define N 5 void main(){i ...
- SQL点滴19—T-SQL中的透视和逆透视
原文:SQL点滴19-T-SQL中的透视和逆透视 透视 今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换.假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣, ...
- 将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。输出逆序后数组的整数,每两个整数之间用空格分隔。
描述 将一个数组中的值按逆序重新存放.例如,原来的顺序为8,6,5,4,1.要求改为1,4,5,6,8. 输入 输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每 ...
- 【软件构造】--Java中的协变与逆变
提示:本文主要讨论Java中的协变与逆变 Java中的协变与逆变 前言 一.Liskov替换原则(LSP) 二.协变(Covariance)和逆变(Contravariance) 1.概念 三 讨论 ...
- java句子倒序_Java实现英文句子中的单词顺序逆序输出的方法
摘要:这篇Java开发技术栏目下的"Java实现英文句子中的单词顺序逆序输出的方法",介绍的技术点是"逆序输出.单词顺序.英文句子.Java.实现.方法",希望 ...
- 将一个数组中的值按逆序重新存放,编写C语言程序
将一个数组中的值按逆序重新存放,编写C语言程序: #include<stdio.h> int main() { int a[5]={8,6,5,4,1},i,b[5]; for(i=0;i ...
最新文章
- php记录读取数据类型,数据读取 · ThinkPHP 3.2.3开发手册 · 看云
- r语言聚类分析_图说层次聚类分析原理和R语言实现
- 与JBoss BPM Travel Agency更新了现代BPM数据集成
- 架构的坑系列:重构过程中的过度设计
- java键盘监听keyadapter_JAVA 键盘监听当中,释放键盘并没有停止运动
- 创建完maven工程之后,提示[FATAL_ERROR] Cannot start Maven: Project JDK is not specified. a href=''Configure...
- win10如何桌面添加计算机,win10系统桌面怎么添加计算机等图标
- 2021版Java同步器教程03:如何使用同步器 CyclicBarrier?
- Send函数和Recv函数解析
- 阿里云MFA绑定Chrome浏览器
- 《mysql必知必会》学习笔记
- Whiten process——数据的白化处理
- 带你玩转以太坊智能合约的”Hello World“
- 数学建模 之 ARCH模型和GARCH模型
- 039.简单的文本编辑器
- 一种基于输出电压的欠压保护电路设计方案
- Java:支付宝当面付demo(公钥证书方式)-沙箱环境测试版
- windows中oracle自动备份
- base64转图片,浏览器前面加
- Android Studio代理
热门文章
- 从0到1简易区块链开发手册V0.3-数据持久化与创世区块
- Oracle-13:Oracle中的表分区
- 第五周项目2-对象作为数据成员
- HDU 2896 病毒侵袭【AC自动机】
- 基于事件驱动架构构建微服务第16部分:Azure Active Directory B2C
- .Net Core with 微服务 - Consul 注册中心
- .Net Core with 微服务 - Ocelot 网关
- 记一次 .NET WPF布草管理系统 挂死分析
- 使用Select.HtmlToPdf 把html内容生成pdf文件
- .NET5在开发平台上远优于Java,如何发挥优势?