首页 > 编程语言 >《c#高级编程》第4章C#4.0中的更改(八)——协变和逆变

《c#高级编程》第4章C#4.0中的更改(八)——协变和逆变

时间:2023-04-25 13:56:43浏览次数:34  
标签:4.0 c# 逆变 C# Animal 协变 类型 public

一、协变

C#协变是指在一些特定的情况下,可以将一个派生类型的实例赋值给其基类或接口类型的引用。这里的“派生类型”指的是从某个基类或接口继承并增加了新的成员的类型。

C# 4.0 引入了对协变和逆变的支持。其中,协变针对的是返回类型,逆变则针对参数类型。通过使用协变和逆变,可以使得某些代码更加简单、易读,并且减少需要编写的重复代码。

具体来说,协变的主要提升体现在以下方面:

  1. 委托类型的协变:在 C# 2.0 中,委托类型必须完全匹配,也就是说,委托类型的参数和返回类型必须与目标方法的参数和返回类型完全相同。但在 C# 3.0 中,引入了委托类型的协变功能,可以将一个返回类型为派生类型的方法赋值给一个返回类型为基类类型(或接口类型)的委托变量,这样可以避免显式地进行类型转换。例如:

    public delegate T MyDelegate<out T>();
    public class Animal { }
    public class Mammal : Animal { }
    public class Giraffe : Mammal { }
    
    // 协变: Giraffe 是 Mammal 的派生类, Mammal 是 Animal 的派生类
    MyDelegate<Giraffe> giraffe = () => new Giraffe();
    MyDelegate<Mammal> mammal = giraffe;
    MyDelegate<Animal> animal = giraffe;
    
  2. 泛型类型参数的协变:在 C# 4.0 中,可以使用 out 关键字来声明泛型接口或委托的类型参数是协变的。这样,就可以将一个泛型类型的实例赋值给其基类或接口类型的引用。例如:

    public interface IMyInterface<out T> { }
    public class Animal { }
    public class Mammal : Animal { }
    
    // 协变: Mammal 是 Animal 的派生类
    IMyInterface<Mammal> mammal = null;
    IMyInterface<Animal> animal = mammal;
    

总之,C#的协变功能使得代码更加简洁、清晰,并且提高了代码的可读性和可维护性。
二、逆变
C#逆变是指在一些特定的情况下,可以将一个基类或接口类型的引用赋值给其派生类型的实例。这里的“派生类型”指的是从某个基类或接口继承并增加了新的成员的类型。

C# 4.0 引入了对协变和逆变的支持。其中,协变针对的是返回类型,逆变则针对参数类型。通过使用协变和逆变,可以使得某些代码更加简单、易读,并且减少需要编写的重复代码。

具体来说,逆变的主要应用场景是:

  1. 委托类型的逆变:在 C# 2.0 中,委托类型必须完全匹配,也就是说,委托类型的参数和返回类型必须与目标方法的参数和返回类型完全相同。但在 C# 4.0 中,引入了委托类型的逆变功能,可以将一个接受基类类型(或接口类型)参数的方法赋值给一个接受派生类型参数的委托变量,这样可以避免显式地进行类型转换。例如:

    public delegate void MyDelegate<in T>(T arg);
    public class Animal { }
    public class Mammal : Animal { }
    public class Giraffe : Mammal { }
    
    // 逆变: Animal 是 Mammal 的基类, Mammal 是 Giraffe 的基类
    MyDelegate<Animal> animal = (a) => Console.WriteLine(a.GetType());
    MyDelegate<Mammal> mammal = animal;
    MyDelegate<Giraffe> giraffe = animal;
    
  2. 泛型接口类型参数的逆变:在 C# 4.0 中,可以使用 in 关键字来声明泛型接口的类型参数是逆变的。这样,就可以将一个基类或接口类型的引用赋值给其派生类型的实例。例如:

    public interface IMyInterface<in T> { }
    public class Animal { }
    public class Mammal : Animal { }
    
    // 逆变: Animal 是 Mammal 的基类
    IMyInterface<Animal> animal = null;
    IMyInterface<Mammal> mammal = animal;
    

总之,C#的逆变功能使得代码更加简洁、清晰,并且提高了代码的可读性和可维护性。

标签:4.0,c#,逆变,C#,Animal,协变,类型,public
From: https://www.cnblogs.com/DinAction/p/17352378.html

相关文章

  • 办公套件Microsoft Office LTSC 2021最新中文Mac版
    MicrosoftOfficeLTSC2021(office全家桶)中文版是Microsoft为Mac用户推出的一款新iPadMac系列电脑、iPad桌面应用程序。OfficeLTSC2021是MicrosoftOffice系列电脑、iPad电脑和桌面应用程序的新一代操作系统和办公自动化产品。它采用了Mac和Linux操作系统的同步版......
  • CF1479 Div1 VP记录
    战况:别的不说,这个B1WA3发是真的精髓。A略B我们设此时在第一队队尾的为las0,在第二队队尾的为las1,要放的数为x。先考虑B1:显然有:如果las0等于x,放在第二队,如果las1等于x,放在第一队。考虑两边都不同的情况,我们想要这个x后面尽快跟上一个不同的数,依此来创造新的......
  • 开关电源中变压器次级线圈链接的二极管叫什么?自由轮二极管Free-Wheeling Diode或者反
    “自由轮二极管”(Free-WheelingDiode)和“反并二极管”(FlybackDiode)这两个词汇都是出自电气工程领域,与开关电源和变压器等相关的电路设计有关。“自由轮二极管”一般用于开关电源中,当负载电流为零时,开关管需要关闭,此时,变压器的磁场崩溃,产生能量,自由轮二极管用来消除变压器次级中......
  • 逼真的刺绣Photoshop插件-Realistic Embroidery 3.0汉化版 Win/Mac版通用
    使用RealisticEmbroidery3.0插件只需单击几下,即可将文本、徽标或形状转换为逼真的刺绣/缝合元素。逼真的刺绣3现在是一个完整的Photoshop插件,具有界面、改进的工作流程和许多新功能,将使您的数字缝纫体验更加美好!如图所示,自己体验吧!Bevel我翻译成的倒角,或许有其他更好的翻译,自己......
  • Electron MacOs 打包 签名 公证(保姆级别)
    前述1MacOS10.15之前,应用如果没有进行签名,首次打开的时候就会出现“恶意软件”提示。首先你要有一个苹果开发者账号交完年费的那种arm64(M系列芯片)架构打包需要增加兼容x86处理开发者证书慎重申请,DeveloperIDApplication这个证书申请一个就够了,其他证书可以删除这个......
  • Service层报错org.apache.ibatis.binding.BindingException: Invalid bound statement
    如果在主启动类配置了包扫描@MapperScan注解,这个位置目录一定要写到dao层的目录,如:@MapperScan(“com.company.module.dao”)如果没有写到具体的dao层目录,写成@MapperScan(“com.company”)扫描的时候会把com.company.module.service目录也认为是dao目录扫进来,这时用到@Service注解......
  • C语言函数大全-- q 开头的函数
    C语言函数大全本篇介绍C语言函数大全--q开头的函数1.qsort1.1函数说明函数声明函数功能voidqsort(void*base,size_tnmemb,size_tsize,int(*compar)(constvoid*,constvoid*));用于将指定数组按指定顺序进行排序参数:base:指向要排序的数组的......
  • GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现
    规范解读GB/T28181-2022和GB/T28181-2016规范,有这么一条“更改了附录D基于TCP协议的视音频媒体传输要求(见附录D,2016年版的附录L)。”。本文主要是针对GB/T28181-2022里面提到的“基于TCP协议的视音频媒体传输要求”做相应的接口适配,在此之前,我们先回顾下规范里面针对这部分......
  • ceph-san跨存储迁移指导文档
    CEPH-SAN存储后端迁移指导文档确认需要进行虚拟机的UUID和宿主机节点当前宿主机节点为FZHZ4-TSTACK-COM05确认该宿主机节点是否对接FCSAN对接SAN后需要满足以下条件才可进行跨存储迁移1).HBA卡要插线,确认有端口速率2).在SAN存储上添加映射关系3).SAN交换机zone要划分正取可......
  • LeetCode 131.分割回文串
    1.题目:给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]来源:力扣(LeetCode)链接:https......