C#中协变与抗变(逆变)】的更多相关文章

摘要 ● 协变和逆变的定义是什么?给我们带来了什么便利?如何应用? ● 对于可变的泛型接口,为什么要区分成协变的和逆变的两种?只要一种不是更方便吗? ● 为什么还有不可变的泛型接口,为什么有的泛型接口要故意声明成不可变的? ● 复合的可变泛型接口遵循哪些规则? ● 协变和逆变的数学定义是什么?如何利用数学模型解释C#4里的协变和逆变的规则? 前言 协变和逆变是c#4.0引入的新概念,主要是针对于泛型而言的.有了它们,我们可以更准确的定义泛型委托和接口. 首先举个栗子,比如IEnumerable<…
泛型在.NET 2.0中正式的引入.在使用泛型的过程中,联系上面向对象的继承性.往往很容易想当然敲出类似以下代码 List<Animal> animalLst=new List<Dog>; 显然这样编译是不通过的.虽然Dog和Animal之间有继承性,但是List<Animal>和List<Dog>这两个类之间并没有继承性.如果要解决这样的问题,用上协变与抗变(逆变),它们统称为变体.是.NET 4.0引入的新特性,但是早在.NET 2.0就引入了. 变体适…
泛型接口和泛型委托中经常使用可变性 in  逆变,out  协变 从 list<string>转到list<object> 称为协变 (string 从object 派生,那么 string 转成object 是合理的,子类替换父类是合理的,) 从list<object> 转到 list<string> 称为逆变 (经object 转成string ,将父类转成子类,是不合理的,称为逆变) 1.逆变代码掩饰 static void Main(string[]…
我们知道子类转换到父类,在C#中是能够隐式转换的.这种子类到父类的转换就是协变. 而另外一种类似于父类转向子类的变换,可以简单的理解为“逆变”. 上面对逆变的简单理解有些牵强,因为协变和逆变只能针对接口和代理类型.而父类和子类之间不存在这种逆变的概念. 协变和逆变的本质都是子类安全的转到父类的过程. 下面就来加深下印象,先定义两个类Car和Baoma public class Car { } public class Baoma : Car { } 明显Baoma(宝马)是Car的子类 1,先来…
需求:泛型使用多态性 备注:协变逆变只能修饰 接口和委托 简单理解: 1.使用 in 修饰后为逆变,只能用作形参使用 ,参考 public delegate void Action<in T>(T obj); 2.使用 out 修饰后为协变,只能用于返回值,参考 public delegate TResult Func<out TResult>(); 其他资料链接:http://www.cnblogs.com/LoveJenny/archive/2012/03/13/2392747…
看下面一段代码 Number num = new Integer(1); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch List<? extends Number> list = new ArrayList<Number>(); list.add(new Integer(1)); //error list.add(new Float(1.2f)); //error 有人会…
转自: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).…
转载自  fineqtbull   http://fineqtbull.iteye.com/blog/477994 有位je上的同学来短信向我问起了Scala类型参数中协变.逆变.类型上界和类型下界的使用方法和原理,自己虽然也刚学不久,在主要调查了<Programing in Scala>的19章后,试着在下面做一个总结.如有错误之处还请各位指正. 先说说协变和逆变(实际上还有非变).协变和逆变主要是用来解决参数化类型的泛化问题.由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数…
转自:http://fineqtbull.iteye.com/blog/477994#bc2364938 有位je上的同学来短信向我问起了Scala类型参数中协变.逆变.类型上界和类型下界的使用方法和原理,自己虽然也刚学不久,在主要调查了<Programing in Scala>的19章后,试着在下面做一个总结.如有错误之处还请各位指正. 先说说协变和逆变(实际上还有非变).协变和逆变主要是用来解决参数化类型的泛化问题.由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数是继承关系…