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小时内与您取得联系。