在刚刚落下帷幕的PDC上,我们得到了很多振奋的消息,包括C# 4.0及VS2010等等。Anders Liu 已经 将C# 4.0 新特性白皮书翻译了 出来,那里面有非常详细的介绍。

C#的发展是很快很快的,C#的设计目的是成为一个有趣有用通用的程序语言,并因此让使用该语言的用户能获得更大的成功。所以,C#除了面向对象的基本特征外,现在引入了相当多的其他特征喔!

动态,动态。动态是目前超级流行的词汇。C#也要动起来了喔!

C# 4.0的主要主题是动态编程。对象的意义变得越来越“动态”,它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程序时无法得知对象的结构和行为。

相关的特性有动态查找命名参数可选参数等。

还有,简化了与COM的互操作

还有,协变逆变 Covariance and contravariance

这些都在白皮书里可以找到介绍。我在这里整理一下协变和逆变的一些参考资料,本来数学就不好,怕过一两天就又忘了,俗话说,好记性不如烂笔头嘛。

首先看看问题的引入。

这里有两个类型,T 和 U,在这两个类型间,以下伪表达式肯定有一个是“真”:

  • T > U
  • T < U
  • T = U
  • T 和 U 没有任何关系

例如有这些类型:动物 Animal哺乳动物 Mammal爬行动物 Reptile长颈鹿 Giraffe老虎 Tiger蛇 Snake海龟 Turtle,它们之间的继承关系(应该来个UML就一目了然了)有:哺乳动物动物的一个子类,长颈鹿哺乳动物的一个子类等等……

看图:

那么就有:哺乳动物长颈鹿大,比动物小,等于哺乳动物,和爬行动物却没有关系(这里的比较都不是对象之间的比较,要注意哦。

呃,如果这个难于理解,我们再看看程序中的情况。假设有一个变量,这个变量在C#中有一个容身之处(不是说的存储区的物理地址),每一个变量在C#中的容身之处都对应一个类型(强类型语言就是这样的),那么,在运行时你可以在一个特定的容身之处存储对应类型的实例或者小于这个类型的类型的实例(拗口-,-)。所以呢,哺乳动物对象对应的容身之处可以存储一个长颈鹿,但是不能存储一个海龟。(考虑面先接口编程和抽象基类的思想

容身之处这个例子说明的是“交换原则”,跟面向接口编程和抽象基类的机制很类似,也就是在很多地方,我们用子类代替基类(或接口或抽象类)来使用。

现在来定义什么是协变:一个操作如果在 T 和 U 两个类型上执行后返回的 T' 和 U' 之间的关系跟原来的 T 和 U 之间的关系(上面那4个伪表达式)相同,则这个操作就叫做协变。英文名:Covariance。

再看看什么是逆变:一个操作如果将 T 和 U 的大小关系改变了(大变小,小变大 - 逆转),但是不改变 T 和 U 之间的相等或不相干这两个关系,则这个操作就叫做逆变。英文名:Contravariance。

呃呃。变来变去,头已经晕了。

(还没完,等我喔!)

转载于:https://www.cnblogs.com/shinyzhu/archive/2008/11/14/covariance-and-contravariance-in-csharp.html

C# 4.0中的协变和逆变(一)相关推荐

  1. typescript中的协变、逆变

    typescript中的协变.逆变 ​ 想要写出更加优秀的类型编程co-variance(协变)contra-variance(逆变)这类知识是我们必须掌握的.这篇记录也仅仅是为了方便之后哪天这块知识 ...

  2. 【软件构造】--Java中的协变与逆变

    提示:本文主要讨论Java中的协变与逆变 Java中的协变与逆变 前言 一.Liskov替换原则(LSP) 二.协变(Covariance)和逆变(Contravariance) 1.概念 三 讨论 ...

  3. spark笔记之Scala中的协变、逆变、非变

    1.1. 协变.逆变.非变介绍 协变和逆变主要是用来解决参数化类型的泛化问题.Scala的协变与逆变是非常有特色的,完全解决了Java中泛型的一大缺憾:举例来说,Java中,如果有 A是 B的子类,但 ...

  4. 协变逆变java_Java中的协变与逆变

    Java作为面向对象的典型语言,相比于C++而言,对类的继承和派生有着更简洁的设计(比如单根继承). 在继承派生的过程中,是符合Liskov替换原则(LSP)的.LSP总结起来,就一句话: 所有引用基 ...

  5. C#中协变和逆变的基本概念、List和List.Select方法的命名空间

    在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反. msdn 解释如下: "协变"是指能够使用与原始指定的派生类 ...

  6. .Net中委托的协变和逆变详解

    关于协变和逆变要从面向对象继承说起.继承关系是指子类和父类之间的关系:子类从父类继承所以子类的实例也就是父类的实例.比如说Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是Do ...

  7. .NET可变性解析(协变和逆变)

    [一]何为可变性 可变性是.NET4.0中的一个新特性,可变性可分为 : 协变性.逆变性.不可变性. 那么在.NET4.0之前是否有可变性? 答案是肯定的,我们可以通过下面的几个实例来简单的了解一下. ...

  8. java协变 生产者理解_Java进阶知识点:协变与逆变

    一.背景 要搞懂Java中的协办与逆变,不得不从继承说起,如果没有继承,协变与逆变也天然不存在了. 我们知道,在Java的世界中,存在继承机制.比如MochaCoffee类是Coffee类的派生类,那 ...

  9. 对协变和逆变的简单理解

    毕业快一年了,边工作边学习,虽说对.net不算精通,但也算入门了,但一直以来对协变和逆变这个概念不是太了解,上学时候mark了一些文章,今天回过头看感觉更糊涂了,真验证本人一句口头禅"知道的 ...

最新文章

  1. java hanoi_Hanoi问题java解法
  2. 突发!Spring Cloud 爆高危漏洞。。赶紧修复!!
  3. 面试官 | 写if 时不带 else,你的代码会更好!
  4. 推荐大家一个保护视力的Visual Studio皮肤
  5. wxWidgets:wxCustomBackgroundWindow<W> 类模板用法
  6. 笔记本(华硕UL80VT)软件超频setFSB
  7. arm32和arm64常用指令B BL BLX机器码计算
  8. Mysql查询数据(单表查询)
  9. 非线性回归 python_回归算法之非线性回归
  10. 阿里云ECS上使用docker搭建filebeat+kafka集群+zookeep集群+logstash+elasticsearch集群+kibana实现跨主机日志收集系统【四】
  11. 领存技术至强 E5-2648L 6U VPX 通用密集计算刀片
  12. Python基础 [...,]三点切片
  13. flutter Timer 延时器,定时器详解
  14. C++中指针是什么?
  15. channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no
  16. 怎么用计算机计算每月电费,电费每个月怎么算的 电费阶梯电价是怎样算
  17. json数据和对象的区别
  18. DELMIA软件 机器人焊枪的装配
  19. wex5 数据绑定组件简单介绍
  20. Linux中rename命令的用法

热门文章

  1. 标 题:[转帖]SQL Server日期计算(收藏)
  2. python没有英文基础能学吗-初中毕业没有英语基础能学编程吗?该学C或者Python?...
  3. python 读取文件读出来是什么格式-深入学习python解析并读取PDF文件内容的方法...
  4. python turtle库画图案-python之绘制图形库turtle(转)
  5. python操作excel-python操作excel(内附python教程分享)
  6. 刚安装的python如何使用-Anaconda介绍、安装及使用教程
  7. 财务大数据比赛有python吗-Python去做大数据开发,真的有前景吗?
  8. 怎么检查python是否安装成功-检查python以及django是否安装配置成功
  9. python基本语法规则-Python-基本语法元素
  10. python小游戏源码-Python小游戏之300行代码实现俄罗斯方块