协变和逆变-Covariance and Contravariance

在C#4.0新特性介绍中,总是免不了对协变和逆变的介绍。但似乎协变逆变又很鸡肋。我试图简单地讲下协变(Covariance)和逆变(Contravariance)。

1,Co&Contravariance并非C#4.0引入的,早在C#1.0中就有了。只是C#4.0加入了对Generic Type的Co&Contravariance的支持。

2,Co&Contravariance是静态语言用来支持(安全的隐式)类型转换的技术。

3,Co&Contravariance都满足Liskov原则:子类可以替换基类(在需要较少信息的基类时候,可以提供较多信息的子类来替代)。

4,只支持引用类型,值类型则不支持。

 

Covariance

对Caller来说,需要返回一个基类。对Callee来说,实际返回了一个子类。看如下代码片段:

class Base{}
class Sub:Base{};
static Base SomeMethod()
{return new Sub();    //Sub casting up to Base.
}

Caller: Access Sub via Base

Callee: Return Sub for Base

从Callee的视角来看:子类安全地向上Casting——提供了更多信息.

 

Contravariance

对Callee来说,需要传入一个基类。对Caller来说实际传入一个子类。代码如下:

class Base{}
class Sub:Base{};
static void SomeMethod(Base b)
{Sub sb = (Sub)b;   //Base casting down to Sub
}
static void Main(string[] args)
{SomeMethod(new Sub());
}

 

Callee:Access Sub via Base

Caller:Pass Sub for Base

从Callee的角度来看:基类向下Casting——可以提供更多信息.

 

Reference

http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)

http://www.cnblogs.com/fox23/archive/2009/12/03/covariance-contravariance-in-csharp-4.html

http://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html

转载于:https://www.cnblogs.com/Jerry-Chou/archive/2010/04/29/1723664.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汉字笔画动图怎么做_动态图示范汉字笔顺标准,超全面!

忄先写点和点,最后写竖。匕先写撇,后写竖弯钩。万先写横,再写横折钩,后写撇。母字的最后三笔是点、横、点。及先写撇,再写横折折撇,后写捺。乃先写横折折撇,再写撇。这个字和及字形相近&#xf…

孙悟空的师父是谁? (ZT)

猜测之一 孙悟空是只石猴,很多年后有人说他是这本书的真正主角,其实这是不恰当的,他只是“第一主角”。因为西游的队伍里每个人都是主角,包括龙马。 孙悟空是天产石猴,生于花果山水帘洞,得育明师。修成大道…

decimalformat精度丢失_php intval 两位小数乘以100后结果少1

ASP.NET Core开发-后台任务利器Hangfire使用ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...【转】NGUI创建UIRoot后报NullReferenceException的解决办法…

小米用户画像_腾讯企鹅智库发布手机品牌用户画像:华为一二线城市用户少于小米...

近日,腾讯旗下企鹅智库公布了《2019中国网民智能手机购机用户画像分析》,统计了国内各大手机品牌的用户特征,结论非常有趣。《分析》统计显示,苹果是所有手机品牌中一线城市用户占比最高的品牌,占比高达31.4%&#xff…

NLP(二十一)根据已有文本LSTM自动生成文本

根据已有文本LSTM自动生成文本 原理 与股票预测类似,用前面的n个字符预测下一个字符https://www.cnblogs.com/peng8098/p/keras_5.html代码from __future__ import print_function import numpy as np import random import syspath rshakespeare_final.txt text …

友盟小米收不到推送消息_Android 推送集成华为,小米,友盟

在小米推送运营平台创建应用,地址点这里, 获取到 AppID , AppKey把从小米下载的 jar 放到 libs 下在 AndroidManifest.xml 中添加权限配置推送服务需要的service和receiverandroid:enabled"true"android:process":pushservice"android:name&quo…

RHEL7单独安装图形X11

RHEL7 默认是最小化安装(Minimal Install),没有图形界面,我们应该选择Server with GUI。若已错过此步骤,我们采用以下方式补充安装GUI界面。 # yum group list Available Environment Groups:Minimal InstallCompute N…

485通讯线是几芯的_小令老师说门禁| 为什么485门禁必然会取代韦根?

韦根和485(RS485)是两种不同的通讯协议。通讯协议解决的是通讯双方数据如何传输和如何控制的问题。对于门禁而言,指的是读头和控制器之间的通讯。传统门禁很多采用韦根通讯方式,而现在485更为普及,大部分韦根门禁也完成…

【第57题】【062题库】2019年OCP认证062考试新题

57题、choose one Which statement is true about a database in ARCHIVELOG mode? A) Full database backups can be performed when the database is opened. B) A Fast Recovery Area (FRA) must be configured for the database. C) Online redo log files have to be mul…

epoll nio区别_大厂面试系列(二)::NIO和Netty

NIO和Netty面试题 NIO 阐述 NIO原理?BIO/NIO/AIO有什么区别?有那些实现?讲讲NIO的原理与实现?NIO用到了哪个经典技术思想?JDK1.8中NIO有做什么优化了解多路复用机制 常见问题 同步阻塞、同步非阻塞、异步的区别&#x…

【第58题】【062题库】2019年OCP认证062考试新题

58题、choose two Which two statements are true about Oracle network connections? A) A listener may listen on behalf of only one database instance at a time. B) A server process checks a users authentication credentials and creates a session if the credent…

树莓派不支持显示器_Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)...

一. 准备工作1. 树莓派主板型号:树莓派3 B型处理器:四核64位ARM Cortex-A53 CPU内核架构:ARMv82. 一张大于8G的TF卡(本人用的是32G的,也作为PiLFS用)3. 一台笔记本电脑,一根网线4. 点击此找到并下载 Raspbian 系统初学…

Google搜索:HTML5 金海龙

想找到我,记得Google搜索! 博客地址没必要记忆! Google一下,总能找到我! 我喜欢你们Google搜索:.net 金海龙 本站有关于HTML5 Canvas的技术文章都可以在国际网站“http://htmlcanvas.webgarden.com”上找到…

拦截地址栏参数_selenium操作chrome时的配置参数

参数说明:about:version - 显示当前版本about:memory - 显示本机浏览器内存使用状况about:plugins - 显示已安装插件about:histograms - 显示历史记录about:dns - 显示DNS状态about:cache - 显示缓存页面about:gpu -是否有硬件加速about:flags -开启一些插件 chrome…

MS Office VBA(包括Excel VBA、Word VBA、Access VBA等)资料下载汇总

VBA(Visual Basic for Application):OReilly VB & VBA 简明教程 Office VBA编程手册合集大全 (CHM) Microsoft Office VBA 语言参考 Microsoft Office 2007 System VBA 编程 Office VBA 编程高手 VBA 傻瓜书 第五版 Excel VBA:中文版Excel 2007高级VBA编程宝典Excel 2007与…

升级步骤linux_开发人员福音,在win10系统上安装linux子系统

对于软件开发人员来说,linux基本上是一个绕不过去的槛。 因为工作经常要用到linux,电脑用纯linux还是windows 虚拟机装linux,我一直纠结。因为我要使用docker的原因,所以就搜索到这文章了。如果装个纯linux,则一些win…

C++之父名著——C++程序设计原理与实践 英文原版

C之父名著——C程序设计原理与实践 英文原版转载于:https://www.cnblogs.com/gavinhughhu/archive/2010/08/18/1801986.html

curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!

【导语】:Python实现的HTTP请求命令行客户端,我理解为curl的Python版本,但是提供了更友好,更易使用的命令及选项。简介HTTPie是使用Python实现的HTTP命令行工具,提供了更人性化、交互性更好的命令和选项,可…

python计算文件md5值

md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等。下面讲解在python中如何使用md5算…

文件打开特别慢_“Origin进不去、下载慢”的解决办法合集

玩儿烂橘子的游戏,喜闻乐见会见到下面这句话:呃,发生了些意料之外的事情。其实,这还挺意料之中的。▌进不去方法①:挂加速器。加速器挂Steam或者Origin大厅一般是免费的,没效果就换一个节点、模式、加速器。…