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

yubabuneng yubabuneng     2022-12-24     204

关键词:

  今天回忆了之前看的《深入理解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"));
        
    

  

通过观察代码我们发现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<string>类型是IDemo<object>类型的子类型,但是在这里我们却将父类型隐式转换为子类型的用法叫逆变。(这里必须要用in)

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

进入快速通道的委托(深入理解c#)

...的名称相同的重载方法合在一起就成为一个方法组。2.协变性和逆变性:协变性指的是——泛型类型参数可以从一个派生类隐式转化为基类。逆变性指的是——泛型类型参数可以从一个基类隐式转化为派生类。注意事项:1.只有... 查看详情

第十七章委托

...回调。将方法绑定到委托时,C#和CLR都允许引用类型的协变性和逆变性。协变性是指方法能返回从委托的返回类型派生的一个类型。逆变性是指方法获取的参数可以是委托的参数类型的基类型。只要引用类型才支持协变性与逆变... 查看详情

c#中string类型的不可变性(代码片段)

...,却没有深入的去了解,今天在书中忽然看到它具有不可变性;于是便仔细了解了一下。//声明并初始化string类型变量stringText=“Hello”;//对string类型变量赋值Text=“Hi”在这里,在把Hi字符串赋给string变量Text之前 内... 查看详情

不变性/只读语义(特别是 C# IReadOnlyCollection<T>)

】不变性/只读语义(特别是C#IReadOnlyCollection<T>)【英文标题】:Immutability/Read-onlysemantics(particularC#IReadOnlyCollection<T>)【发布时间】:2013-07-2412:19:34【问题描述】:我怀疑我对System.Collection.Generic.IReadOnlyCollection&lt;T& 查看详情

java泛型的不变性(invariance)协变性(covariance)逆变性(contravariance)(代码片段)

...takeFruit()方法privatestaticvoidtakeFruit(Plate<Fruit>plate)1、不变性(invariance)调用takeFruit方法,尝试把一个装着苹果的盘子传进去:takeFruit(newPlate<Apple>(newApple()));//泛型之不变发现编译器报错,发现装着苹果的盘子竟然... 查看详情

关于卷积神经网络旋转不变性的一点研究

今天一直在思考CNN的旋转不变性,众所周知,CNN具有平移不变性,但是是否具有旋转不变性呢。我们来研究下吧。 1查阅资料查阅了许多国内外资料,在解释旋转不变性的时候,普遍得出来,CNN具有一定的旋转不变性,但是这... 查看详情

cnn网络中的不变性理解

神经网络中的不变性原文:https://blog.csdn.net/voxel_grid/article/details/79275637     个人认为cnn中conv层对应的是“等变性”(Equivariance),由于conv层的卷积核对于特定的特征才会有较大激活值,所以不论上一层特征... 查看详情

spatialtransformernetworks(stn)-论文笔记

...成效,主要是得益于CNN的深层结构具有:平移不变性、缩小不变性\\colorred平移不变性、缩小不变性平移不变性、缩小不变性;还对缺失的空间不变性(spatially  invariance)\\colorred空间不变性(spatially\\;inv... 查看详情

*** URL 缺乏不变性。为啥? [复制]

】***URL缺乏不变性。为啥?[复制]【英文标题】:Lackofinvariancein***URL.Why?[duplicate]***URL缺乏不变性。为什么?[复制]【发布时间】:2010-12-0418:50:29【问题描述】:可能重复:Whydosomewebsitesadd“Slugs”totheendofURLs?这不是关于***的问题,... 查看详情

了解 SSTable 不变性

】了解SSTable不变性【英文标题】:UnderstandingSSTableimmutiability【发布时间】:2018-06-2311:44:42【问题描述】:我试图更好地理解Cassandra中sstable的不变性。当数据存在于memtable中时,插入操作或更新/删除操作中会发生什么非常清楚。... 查看详情

使用 cloudformation 在 AWS ECR 中指定标签不变性

】使用cloudformation在AWSECR中指定标签不变性【英文标题】:specifytagimmutabilityinAWSECRusingcloudformation【发布时间】:2020-02-2908:31:44【问题描述】:是否可以在AWSECRCloudFormation模板中指定图像标签不变性?图像标签不变性是https://docs.aws... 查看详情

OrderedDict 的(不)可变性

】OrderedDict的(不)可变性【英文标题】:(Im)mutabilityofOrderedDict【发布时间】:2021-12-2807:54:36【问题描述】:Python的OrderedDict数据结构是可变集合吗?documentation对此没有说什么,在网上快速搜索后,我还没有找到任何答案。【问... 查看详情

使用内部可变性模式的“BorrowMutError”

】使用内部可变性模式的“BorrowMutError”【英文标题】:"BorrowMutError"usingtheInteriorMutabilityPattern【发布时间】:2020-12-3023:44:29【问题描述】:我正在尝试使用内部可变性模式来共享可变引用。但是,当我尝试使用与它共享... 查看详情

javascript中的不可变性(immutability)

 什么是不可变性(Immutability)? 即某个变量在进行了某个操作之后,其本身没有发生变化,比如对于字符串而言,对字符串的任何操作都会改变字符串本身的值,而是在字符串的基础上复制出来一个然后再改变,这样我们... 查看详情

元组不变性讨论

元组的儿子不能变,但孙子可以变。li=(22,25,"test",{"name":"dsj","age":33,"sex":"female"},[5,6,7])li[4].append("test")print(li)  查看详情

转string的不变性immutable(代码片段)

转 https://blog.csdn.net/limm33/article/details/54962259 我们经常在Java里面提到String的不变性,下面就来说一下对于String的不变性的理解:可以参考以下程序: Stringstr="Hello";System.out.println(str);//输出为Hellostr.concat("World"); 查看详情

c#学习笔记8

...型方法的约束设置与泛型类的约束设置,是一样的;2.协变性与逆变性:在泛型中,将一个较具体的类 查看详情

TIMESTAMPTZ 和函数不变性的索引

】TIMESTAMPTZ和函数不变性的索引【英文标题】:IndexforTIMESTAMPTZandfunctionimmutability【发布时间】:2019-10-1520:30:16【问题描述】:我们有一个类似下面的结构:createtablecompany(idbigintnotnull,tztextnotnull);createtablecompany_data(company_idbigintnotnull... 查看详情