返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >图文详解C#中的协变与逆变
  • 554
分享到

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

2024-04-02 19:04:59 554人浏览 八月长安
摘要

目录前言协变和逆变总结前言 这篇文章简单说说C#中的协变和逆变。 在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 = GetAge;
            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#协变与逆变内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 图文详解C#中的协变与逆变

本文链接: https://lsjlt.com/news/138179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 图文详解C#中的协变与逆变
    目录前言协变和逆变总结前言 这篇文章简单说说C#中的协变和逆变。 在C#编程中,由于存在类型之间的强制转换,很容易会出现所谓的类型可变性说法,存在协变、逆变、不变三种。 就比如前一篇...
    99+
    2024-04-02
  • 一文带你了解C#中的协变与逆变
    目录协变协变接口的实现逆变里氏替换原则协变 协变概念令人费解,多半是取名或者翻译的锅,其实是很容易理解的。 比如大街上有一只狗,我说大家快看,这有一只动物!这个非常自然,虽然动物并不...
    99+
    2023-02-26
    C# 协变 逆变 C# 协变 C# 逆变
  • C#中的协变与逆变小结
    一:什么是协变与逆变 协变指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,逆变指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型 只有泛型接口和泛型委托...
    99+
    2024-04-02
  • 详析C#的协变和逆变
    目录为啥C#需要协变和逆变?协变(Covariance)逆变(Contravariance)前言: 在引用类型系统时,协变、逆变和不变性具有如下定义。 这些示例假定一个名为 Base...
    99+
    2024-04-02
  • C#中协变与逆变的示例分析
    这篇文章主要介绍了C#中协变与逆变的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:什么是协变与逆变协变指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类...
    99+
    2023-06-25
  • C#中的协变与逆变怎么实现
    本篇内容介绍了“C#中的协变与逆变怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在C#编程中,由于存在类型之间的强制转换,很容易...
    99+
    2023-06-29
  • 怎么理解Java中的逆变与协变
    这篇文章主要介绍“怎么理解Java中的逆变与协变”,在日常操作中,相信很多人在怎么理解Java中的逆变与协变问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Java中的逆变与协变”的疑惑有所帮助!接下来...
    99+
    2023-06-02
  • C#中的协变与逆变接口怎么实现
    今天小编给大家分享一下C#中的协变与逆变接口怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。协变协变概念令人费解,多半...
    99+
    2023-07-05
  • Typescript协变与逆变简单理解
    目录1. 协变和逆变简单理解2. 协变举例3. 逆变举例4. 更简单点的理解5. 参考1. 协变和逆变简单理解 先简单说下协变和逆变的理解。 首先,无论协变还是逆变,必然是存在于有继...
    99+
    2022-11-13
    Typescript协变与逆变 Typescript协变 Typescript逆变
  • C#泛型的逆变协变之个人理解
    一般来说, 泛型的作用就类似一个占位符, 或者说是一个参数, 可以让我们把类型像参数一样进行传递, 尽可能地复用代码。 我有个朋友, 在使用的过程中发现一个问题 IFace<o...
    99+
    2023-05-14
    C#泛型的逆变协变
  • C#泛型接口的协变和逆变
    1、什么是协变、逆变? 假设:TSub是TParent的子类。协变:如果一个泛型接口IFoo<T>,IFoo<TSub>可以转换为IFoo<TParen...
    99+
    2024-04-02
  • C#泛型的逆变协变是什么
    这篇文章主要介绍“C#泛型的逆变协变是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#泛型的逆变协变是什么”文章能帮助大家解决问题。一般来说, 泛型的作用就类似一个占位符, 或者说是一个参数,...
    99+
    2023-07-05
  • 如何理解TypeScript中的子类型、逆变、协变
    这篇文章主要介绍“如何理解TypeScript中的子类型、逆变、协变”,在日常操作中,相信很多人在如何理解TypeScript中的子类型、逆变、协变问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • 一句话清晰总结C#的协变和逆变
    看到过几篇协变和逆变的文章,但是总觉得写得不够清晰,文章这东西注重要是要把自己想表达的观点表达出来,这个过程应该是把复杂的东西消化出来从而简单化,清晰化,而不是故弄玄虚,反其道而行之...
    99+
    2022-11-13
    C# 协变 逆变
  • Java泛型中逆变和协变的概念
    本篇内容主要讲解“Java泛型中逆变和协变的概念”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java泛型中逆变和协变的概念”吧!正文OK,今天5分钟短文就让咱们聊一聊逆变和协变这俩个概念。1、...
    99+
    2023-06-16
  • C#泛型接口的协变和逆变怎么实现
    本文小编为大家详细介绍“C#泛型接口的协变和逆变怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#泛型接口的协变和逆变怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、什么是协变、逆变?假设:T...
    99+
    2023-06-29
  • 浅谈Java中的桥接方法与泛型的逆变和协变
    目录1. 泛型的协变1.1 泛型协变的使用1.2 泛型协变存在的问题1.2.1 Java当中桥接方法的来由1.2.2 为什么泛型协变时,不允许添加元素呢1.2.3 从Java字节码的...
    99+
    2024-04-02
  • C#中逆变的实际应用场景详解
    目录前言协变的应用场景逆变的应用场景讨论总结前言 早期在学习泛型的协变与逆变时,网上的文章讲解、例子算是能看懂,但关于逆变的具体应用场景这方面的知识,我并没有深刻的认识。本文将在具体...
    99+
    2024-04-02
  • Python中可变变量与不可变变量详解
    目录一 、常见的变量分类1、变量的创建二、变量分类1、、常见的不可变变量2、常见的可变变量三、拷贝的差别四、参数传递的差别前言: C++不同于Python的显著特点,就是有指针和引用...
    99+
    2024-04-02
  • Anaconda环境变量的配置图文详解
    目录前言一、什么是环境变量二、环境变量的作用三、步骤四、小结前言 此文记录了我在进行 Anaconda 环境变量配置的做法 ,希望可以对有需要的朋友们有所帮助或者启发 一、什么是环境...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作