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

泛型在.NET 2.0中正式的引入.在使用泛型的过程中,联系上面向对象的继承性.往往很容易想当然敲出类似以下代码 List<Animal> animalLst=new List<Dog>; 显然这样编译是不通过的.虽然Dog和Animal之间有继承性,但是List<Animal>和List<Dog>这两个类之间并没有继承性.如果要解决这样的问题,用上协变与抗变(逆变),它们统称为变体.是.NET 4.0引入的新特性,但是早在.NET 2.0就引入了. 变体适…
定义 协变:与原始类型转换方向相同的可变性称为协变. 抗变:与派生类型转换方向相同的可变性称为抗变. 补充: 参数是协变的,可以使用派生类对象传入需要基类参数的方法,反之不行 返回值是抗变的,不能使用派生类对象接收返回了基类对象的方法返回值,反之可以 代码展示 public class 协变和抗变 { /// <summary> /// 基类 /// </summary> public class Shape { public double Width { get; set; }…
关键字out和in相信大家都不陌生,系统定义的很多泛型类型大家F12都或多或少看见了.但是实际中又很少会用到,以前在红皮书里看到,两三页就介绍完了.有的概念感觉直接搬出来的,只是说这样写会怎样,并没有形象的将为什么这么设计,什么时候有用.再加上是翻译的语义很生硬,理解起来很费劲.自然又百度一通,看了一大堆大家各抒己见,这东西还是像一个低分辨率的图片一样,不够清晰.其实现在各种知识点基本都知道大概是怎么回事,怎么用,但是总感觉少点什么,不够高清.于是最近写了个控制台,把各种不够高清或者需要高清显示…
在.net4之前,泛型接口是不变的..net4通过协变和抗变为泛型接口和泛型委托添加了一个重要的拓展 1.抗变:如果泛型类型用out关键字标注,泛型接口就是协变的.这也意味着返回类型只能是T. 实例: static void Main(string[] args) { IIndex<Rectangle> rectangles = RectangleCollection.GetRectangles(); IIndex<Shape> shapes = rectangles; Conso…
1.协变和抗变 在.NET 4之前,泛型接口是不变的..NET 4通过协变和抗变为泛型接口和泛型委托添加了一个重要的扩展.协变和抗变指对参数和返回值的类型进行转换.例如,可以给一个需要Shape参数的方法传送Rectangle参数码?下面用示例说明这些扩展的优点. 在.NET中,参数类型是协变的.假定有Shape和Rectangle类,Rectangle派生自Shape基类.声明Display()方法是为了接受Shape类型的对象作为其参数: public void Display(Shape…
前言 本篇继续讲解泛型.上一篇讲解了泛型类的定义细节.本篇继续讲解泛型接口. 泛型接口 使用泛型可定义接口,即在接口中定义的方法可以带泛型参数.然后由继承接口的类实现泛型方法.用法和继承泛型类基本没有区别. 不变.协变和逆变 在.Net4.0之前,泛型接口是不变的..Net4.0通过协变和逆变为泛型接口和泛型委托增加了重要的扩展. 注:本书总体非常好,但在协变和逆变方面,我认为是有缺陷的.我一直偏好通过读书籍来了解技术,而不是逛论坛,但协变和逆变的问题我研究了本书多次,都没搞懂而放弃了,反正平时…
http://blog.csdn.net/aladdinty/article/details/3486532 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 泛型 { class 泛型接口 { public static void Main() { PersonManager man = new PersonManager(); Person per =…
0. 文章目的:   介绍变体的概念,并介绍其对C#的意义 1. 阅读基础   了解C#进阶语言功能的使用(尤其是泛型.委托.接口) 2. 从示例入手,理解变体   变体这一概念用于描述存在继承关系的类型间的转化,这一概念并非只适用于C#,在许多其他的OOP语言中也都有变体概念.变体一共有三种:协变.逆变与不变.其中协变与逆变这两个词来自数学领域,但是其含义和数学中的含义几乎没有关系(就像编程语言的反射和光的反射之间的关系).从字面上来看这三种变体的名字多少有点唬人,但其实际意思并不难理解.广泛…

C#

1.类型推导 ; Console.WriteLine(age.GetType().ToString()); var 关键字还可以配合生成匿名类型,如: , Time = }: 如果有可以将对象转成JSON的方法,就可以非常方便的生成各种动态JSON数据了. 2.公共基类 公共基类 object 是 System.Object 的假名,所有类都继承自 System.Object 类,比如所有对象都可以重写 ToString() 方法. 3.在字符串前面加上 @ 符号,表示非转义字符串. 如 str…
1定义:委托=函数指针 C# public delegate void Test(string str); 等价C++ public void (*Test)(string str): 委托赋值(初始化)和使用: 一个实体函数 :public void show(string str){//略} Test t=new Test(show)或直接Test t=show 这样t就指向Test地址,执行t(“111”)就等于执行show(“111”) 委托的实现就在于将一个函数地址(名)给了委托变量.…