C#.Net筑基-泛型T & 协变逆变】的更多相关文章

前言 本篇继续讲解泛型.上一篇讲解了泛型类的定义细节.本篇继续讲解泛型接口. 泛型接口 使用泛型可定义接口,即在接口中定义的方法可以带泛型参数.然后由继承接口的类实现泛型方法.用法和继承泛型类基本没有区别. 不变.协变和逆变 在.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 =…
C#提供了一组关键字in&out,在泛型接口和泛型委托中,若不使用关键字修饰类型参数T,则该类型参数是不可变的(即不允许协变/逆变转换),若使用in修饰类型参数T,保证"只将T用于输入",则允许T的逆变转换:若使用out修饰类型参数T,保证"只将T用于输出",则允许T的协变转换.下面我们解释两个问题: 为什么类型参数T仅用于输出时可以进行协变转换? 为什么类型参数T仅用于输入时可以进行逆变转换? //定义两个类型 class Animal {} class…
建议45:为泛型类型参数指定逆变 逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类.FCL4.0中支持逆变的常用委托有: Func<int T,out TResult> Predicate<in T> 常用委托有: IComparer<in T> 下面例子演示了泛型类型参数指定逆变所带来的好处: class Program { static void Main() { Programmer p = new Programmer { Name = "Mi…
本章主要讲Scala中的类型参数化.本章主要分成三个部分,第一部分实现一个函数式队列的数据结构,第二部分实现该结构的内部细节,最后一个部分解释其中的关键知识点.接下来的实例中将该函数式队列命名为Queue. 一.函数式队列 函数式队列是一种具有以下三种操作方法的数据结构,并且这些操作都必须在常量时间内完成: head,返回该队列中的第一个元素 tail,返回除第一个元素之外的所有元素组成的新队列 enqueue,将新元素加入原有队列从而得到一个新队列 函数式队列不同于可变队列(mutable q…
public static void main(String[] args) { // Object <- Fruit <- Apple <- RedApple System.out.println(Apple.class.isAssignableFrom(Fruit.class)); System.out.println(Fruit.class.isAssignableFrom(Fruit.class)); System.out.println(Fruit.class.isAssign…
都跟里氏替换原则有关. 协变:你可以用一个子类对象去替换相应的一个父类对象,这是完全符合里氏替换原则的,和协(谐)的变.如:用Swan替换Bird. 逆变:你可以用一个父类对象去替换相应的一个子类对象,这貌似不符合里氏替原则的,不和协(谐)的逆变.如:用Bird替换Swan.…
泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具体参数,其的具体参数可延迟到客户代码中声明.实现.这意味着使用泛型的类型参数T,写一个类MyList<T>,客户代码可以这样调用:MyList<int>, MyList<string>或 MyList<MyClass>.这避免了运行时类型转换或装箱操作的代价和风…
泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具体参数,其的具体参数可延迟到客户代码中声明.实现.这意味着使用泛型的类型参数T,写一个类MyList<T>,客户代码可以这样调用:MyList<int>, MyList<string>或 MyList<MyClass>.这避免了运行时类型转换或装箱操作的代价和风…
协变,逆变与不变 能在使用父类型的场景中改用子类型的被称为协变. 能在使用子类型的场景中改用父类型的被称为逆变. 不能做到以上两点的被称为不变. 以上的场景通常包括数组,继承和泛型. 协变逆变与泛型(C#,Java) 在C#中,泛型参数的类型缺省是不变的,但是我们可以在定义泛型接口或委托时通过给参数类型加上out或in来标注该参数类型是协变还是逆变. 协变意味着你能把 IEnumerable<string> 用在需要 IEnumerable<object> 的地方. 这里 IEnu…