c#4.0新特性之协变与逆变】的更多相关文章

1.C#3.0以前的协变与逆变 如果你是第一次听说这个两个词,别担心,他们其实很常见.C#4.0中的协变与逆变[1](Covariance and contravariance)有了进一步的完善,主要是两种运行时的(隐式)泛型类型参数转换.简单来讲,所谓协变(Covariance)是指把类型从“小”升到“大”,比如从子类升级到父类:逆变则是指从“大”变到“小”,两者各有不同的条件和用途.下面的例子演示了C#3.0以前对协变与逆变支持[2] : 代码1        public class An…
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么?泛型的参数还能声明?对,如果有了参数的声明,则该泛型接口或者委托称为“变体”. List<汽车> 一群汽车 = new List<汽车>(); List<车子> 一群车子 = 一群汽车; 显然,上面那段代码是会报错的, 虽然汽车继承于车子,可以隐士转换为车子,但是List…
连载目录    [已更新最新开发文章,点击查看详细] 在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反. 以下代码演示分配兼容性.协变和逆变之间的差异. // 分配兼容性. string str = "test"; // 将派生类型更高的对象分配给派生类型更低的对象 object obj = str; IEnumerable<string> strings = new List<string>(…
随Visual Studio 2010 CTP亮相的C#4和VB10,虽然在支持语言新特性方面走了相当不一样的两条路:C#着重增加后期绑定和与动态语言相容的若干特性,VB10着重简化语言和提高抽象能力:但是两者都增加了一项功能:泛型类型的协变(covariant)和反变(contravariant).许多人对其了解可能仅限于增加的in/out关键字,而对其诸多特性有所不知.下面我们就对此进行一些详细的解释,帮助大家正确使用该特性. 背景知识:协变和反变 很多人可能不不能很好地理解这些来自于物理和…
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么?泛型的参数还能声明?对,如果有了参数的声明,则该泛型接口或者委托称为“变体”. List<汽车> 一群汽车 = new List<汽车>(); List<车子> 一群车子 = 一群汽车; 显然,上面那段代码是会报错的, 虽然汽车继承于车子,可以隐士转换为车子,但是List…
转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类Dog类,一个泛型接口IMyInterface<T>, 他们的定义如下:   public class Animal { } public class Dog : Animal { } interface IMyInterface<T> {  }   一.  协变和逆变的定义 从.Net…
先做点准备工作,定义两个类:Animal类和其子类Dog类,一个泛型接口IMyInterface<T>, 他们的定义如下:   public class Animal { } public class Dog : Animal { } interface IMyInterface<T> {  }   一.  协变和逆变的定义 从.Net Framework 4.0开始引入了一个新特性:协变与逆变,有人翻译为协变和反变,他们实际上所指的就是不同类型之间的一种转变(Variance).…
协变.逆变 定义 Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型,String的对象可以赋给Object的对象.而Object的数组类型Object[],理解成是由Object构造出来的一种新的类型,可以认为是一种构造类型,记f(Object),那么可以这么来描述协变和逆变: 当A ≦ B时,如果有f(A) ≦ f(B),那么f叫做协变(子类赋值给父类): 当A ≦ B时,如果有f(B) ≦ f(A),那么f叫做逆…
一句话总结:协变让一个粗粒度接口(或委托)可以接收一个更加具体的接口(或委托)作为参数(或返回值):逆变让一个接口(或委托)的参数类型(或返回值)类型更加具体化,也就是参数类型更强,更明确. 通常,协变类型参数可用作委托的返回类型,而逆变类型参数可用作参数类型.对于接口,协变类型参数可用作接口的方法的返回类型,而逆变类型参数可用作接口的方法的参数类型. 协变 我们先来看下面一个来自MSDN的例子:01 // 协变 02 IEnumerable<string> strings = new Lis…
原文:http://www.cnblogs.com/palo/archive/2009/03/01/1400949.html 终于静下心来仔细听了一遍Anders Hejlsberg(Visual Studio组的TECHNICAL FELLOW,C#的设计者之一)在PDC08上讲的"The Future of C#"(http://channel9.msdn.com/pdc2008/TL16/). 回顾C#发展的历史,C#1.0完全是模仿Java,并保留了C/C++的一些特性如str…