c#协变 抗变】的更多相关文章

public class Fa : TranOut<Fa>, TranIn<Fa> { } public class son : Fa, TranOut<son>, TranIn<son> { } public interface TranOut<out t> { } public interface TranIn<in t> { } public class Test { public void test() { //c#4.0 I…
关键字out和in相信大家都不陌生,系统定义的很多泛型类型大家F12都或多或少看见了.但是实际中又很少会用到,以前在红皮书里看到,两三页就介绍完了.有的概念感觉直接搬出来的,只是说这样写会怎样,并没有形象的将为什么这么设计,什么时候有用.再加上是翻译的语义很生硬,理解起来很费劲.自然又百度一通,看了一大堆大家各抒己见,这东西还是像一个低分辨率的图片一样,不够清晰.其实现在各种知识点基本都知道大概是怎么回事,怎么用,但是总感觉少点什么,不够高清.于是最近写了个控制台,把各种不够高清或者需要高清显示…
初识C# C#是微软公司发布的面向对象的.运行于.NET Framework之上的高级程序设计语言.与Java有着明显不同,借鉴Delphi的特点,与COM(组件对象模型)直接集成,是微软公司 .NET windows网络框架的主角. C#是一种语言,.net是一个平台.C#不但可以开发基于.net的应用程序,也可以开发基于WinForm的程序.. net 是 Microsoft 的 XML Web 服务平台,XML Web 服务能使应用程序在 Internet 上传输和共享数据. 特点: 强类…
泛型接口 定义 先来看一个简单的例子: public class Sharp {} public class Rectangle:Sharp {} 上面定义了两个简单的类,一个是图形类,一个是矩形类;他们之间有简单的继承关系,正确的写法: Sharp sharp=new Rectangle(); 就是说“子类引用可以直接转化成父类引用”,或者说Rectange类和Sharp类之间存在一种安全的隐式转换. 那问题就来了,既然Rectange类和Sharp类之间存在一种安全的隐式转换,那数组Rect…
泛型的作用和约定 提高性能 拆箱和装箱 从值类型转换为引用类型为装箱,把引用类型转换为值类型为拆箱 装箱和拆箱很容易使用,但是性能损失比较大,尤其是遍历许多项的时候. List<T>不使用对象,在使用时定义类型 var list = new List<int>(); list.Add(44); // no boxing int item = list[0]; // mo unboxing 不妨将List<T>看做一种新的类型,不在特意的和C++的模板相比较: 泛型类型的…
泛型在.NET 2.0中正式的引入.在使用泛型的过程中,联系上面向对象的继承性.往往很容易想当然敲出类似以下代码 List<Animal> animalLst=new List<Dog>; 显然这样编译是不通过的.虽然Dog和Animal之间有继承性,但是List<Animal>和List<Dog>这两个类之间并没有继承性.如果要解决这样的问题,用上协变与抗变(逆变),它们统称为变体.是.NET 4.0引入的新特性,但是早在.NET 2.0就引入了. 变体适…
在.net4之前,泛型接口是不变的..net4通过协变和抗变为泛型接口和泛型委托添加了一个重要的拓展 1.抗变:如果泛型类型用out关键字标注,泛型接口就是协变的.这也意味着返回类型只能是T. 实例: static void Main(string[] args) { IIndex<Rectangle> rectangles = RectangleCollection.GetRectangles(); IIndex<Shape> shapes = rectangles; Conso…
C#泛型的抗变与协变 学习自 C#本质论6.0 https://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html Overview 一直以来,被抗变与协变的定义搞得头昏脑涨掰持不清,如果在加上泛型在其中作祟,就更加两眼发懵了.所以就暂时略过了这一拦路虎,但是今天在学习Kotlin泛型的时候再一次碰到了这里拦路虎,只硬着头皮迎难而上了. 抗边与协变的定义 协变: 子类想父类方向的类型转换称之为协变 //string[] 向 object[…
定义 协变:与原始类型转换方向相同的可变性称为协变. 抗变:与派生类型转换方向相同的可变性称为抗变. 补充: 参数是协变的,可以使用派生类对象传入需要基类参数的方法,反之不行 返回值是抗变的,不能使用派生类对象接收返回了基类对象的方法返回值,反之可以 代码展示 public class 协变和抗变 { /// <summary> /// 基类 /// </summary> public class Shape { public double Width { get; set; }…
1.协变和抗变 在.NET 4之前,泛型接口是不变的..NET 4通过协变和抗变为泛型接口和泛型委托添加了一个重要的扩展.协变和抗变指对参数和返回值的类型进行转换.例如,可以给一个需要Shape参数的方法传送Rectangle参数码?下面用示例说明这些扩展的优点. 在.NET中,参数类型是协变的.假定有Shape和Rectangle类,Rectangle派生自Shape基类.声明Display()方法是为了接受Shape类型的对象作为其参数: public void Display(Shape…