全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C# 泛型接口的抗变和协变

1, 泛型接口的协变

如果泛型类型用out关键字标注,泛型接口就是协变的。这也意味着返回类型只能是T。

泛型接口的抗变

如果泛型类型用in关键字标注,泛型接口就是抗变的。这样,接口只能把泛型类型T用作其方法的输入,即方法的参数。

这是泛型接口的抗变和协变的定义,那我们下面来用代码说明,直接上代码,

/// <summary>
 /// 泛型接口
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public interface IDisplay< T >
 {
  void Show(T item);
 }
 /// <summary>
 /// 实现泛型接口IDisaplay
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public class ShapDisplay<T> : IDisplay<T>
 {
  public void Show(T item)
  {
   Console.WriteLine("测试成功!");
  }
 }
 /// <summary>
 /// 父类
 /// </summary>
 public class ParentClass
 {
 }
 /// <summary>
 /// 子类
 /// </summary>
 public class SubClass : ParentClass
 {
 }

2, 上面定义了接口和实现了接口,接下来我们来测试实现了接口的类,上代码

class Program
 {
  static void Main(string[] args)
  {
   // 用子类实例化泛型类(简称子类对象)
   IDisplay<SubClass> sub1 = new ShapDisplay<SubClass>();

   // 用父类实例化泛型类(简称父类对象)
   IDisplay<ParentClass> par1 = new ShapDisplay<ParentClass>();

   // 用父类类型接收子类对象(子类对象→父类类型)协变
   IDisplay<ParentClass> parent = sub1;

   // 用子类类型接收父类对象(父类对象→子类类型)抗变
   IDisplay<SubClass> sub = par1;

   Console.ReadKey();
  }
 }

我们会发现代码行12和15会报错,编译不过,为什么呢?

原因很简单,因为我们在最上面是这样定义接口的时候,没有加out也没有加in,即泛型接口默认不会支持抗变和协变,所以编译会报错。

好,那我们接下来给泛型接口修改一下,如下代码

/// <summary>
 /// 泛型接口
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public interface IDisplay<out T>
 {
  void Show(T item);
 }

泛型前面加上out之后,会发现接口中的Show会报错,这又是为何呢?

根据泛型接口的协变,如果泛型类型用out关键字标注,这意味着返回类型只能是T。也就是说方法的返回类型应该是T,而我们Show方法中,方法的参数是T,所以不符合规定,报错。

那我们再来修改代码,如下

/// <summary>
 /// 泛型接口
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public interface IDisplay<in T>
 {
  void Show(T item);
 }

接口完全没问题,但是,囧,main方法中12行依然报错,wtf?

因为泛型类型是用in来标注的,这表示该泛型只支持抗变,12行代码是协变,所以会报错。

到此,泛型接口的抗变和协变也就解释完毕,总结如下3点,

①泛型接口,如果泛型类型前没有关键字out或者in来标注,则该泛型接口不支持抗变和协变,即只能是什么对象指向什么类型。

②如果泛型接口,泛型类型前有关键字out标注,则表示其方法的输出为T类型,也就是方法的返回值。同时该泛型接口支持协变,即,可以用父类的类型指向子类的对象。

③如果泛型接口,泛型类型前面有关键字in标注,则表示其方法的输入为T类型,也就是方法的参数。该泛型接口支持抗变,也就是可以用子类的类型指向父类的对象。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# c#  # 协变和抗变  # 泛型协变  # 泛型抗变  # C#泛型的使用及示例详解  # C#泛型详解及关键字作用  # C#泛型运作原理的深入理解  # C# 泛型集合的自定义类型排序的实现  # 详解c# 泛型类的功能  # 详细介绍C# 泛型  # 详解C#泛型的类型参数约束  # 详解C# 泛型中的数据类型判定与转换  # C#泛型类型知识讲解  # C#语法之泛型的多种应用  # C#泛型设计需要注意的一个小陷阱  # C#泛型概念的简介与泛型的使用  # C#泛型类创建与使用的方法  # C# 泛型的约束  # C# 泛型参数转换  # c#中的泛型委托详解  # C#的泛型方法解析  # C#泛型详解  # 子类  # 报错  # 和协  # 可以用  # 这是  # 实现了  # 也就  # 也没  # 是这样  # 这也  # 很简单  # 再来  # 不支持  # 不符合  # 什么呢  # 能把  # 到此  # 来给  # 这又是  # 来用 


相关文章: 如何在阿里云部署织梦网站?  如何在阿里云香港服务器快速搭建网站?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何高效配置IIS服务器搭建网站?  如何高效生成建站之星成品网站源码?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何在云主机上快速搭建网站?  如何通过商城自助建站源码实现零基础高效建站?  如何登录建站主机?访问步骤全解析  高端网站建设与定制开发一站式解决方案 中企动力  网站制作价目表怎么做,珍爱网婚介费用多少?  简单实现Android文件上传  如何选择高效稳定的ISP建站解决方案?  建站与域名管理如何高效结合?  python的本地网站制作,如何创建本地站点?  如何选择香港主机高效搭建外贸独立站?  广州建站公司哪家好?十大优质服务商推荐  公司网站设计制作厂家,怎么创建自己的一个网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何在阿里云通过域名搭建网站?  如何快速搭建个人网站并优化SEO?  建站之星备案是否影响网站上线时间?  javascript中的try catch异常捕获机制用法分析  西安专业网站制作公司有哪些,陕西省建行官方网站?  郑州企业网站制作公司,郑州招聘网站有哪些?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  香港服务器WordPress建站指南:SEO优化与高效部署策略  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何快速打造个性化非模板自助建站?  c# 服务器GC和工作站GC的区别和设置  如何快速查询网站的真实建站时间?  建站之星后台密码遗忘?如何快速找回?  济南专业网站制作公司,济南信息工程学校怎么样?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何选择美橙互联多站合一建站方案?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  C++如何编写函数模板?(泛型编程入门)  建站为何优先选择香港服务器?  如何在IIS中新建站点并配置端口与IP地址?  免费视频制作网站,更新又快又好的免费电影网站?  定制建站流程步骤详解:一站式方案设计与开发指南  如何获取免费开源的自助建站系统源码?  网站制作公司排行榜,抖音怎样做个人官方网站  如何续费美橙建站之星域名及服务?  如何快速搭建响应式可视化网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。