逆变协变

适用范围

协变逆变在接口泛型和委托泛型中而言

协变

把子类赋值给父类。OUT只能修饰输出参数。

IEnumerable<Para> lp = new List<Chid>();
IMyCustomList<Para> c = new MyCustomList<Chid>();

逆变

把父类赋值给子类。IN只能修饰输入参数。

IMyCustomList<Chid> c = new MyCustomList<Para>();

面向对象中任何父类都可以用子类表示,就是把子类赋值给父类。但是不能把父类赋值给子类。

源码下载

时间: 2024-12-19 12:06:16

逆变协变的相关文章

.NET中的逆变协变

MSDN上的说法: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型----------(注意,这里说的可以使用更具体的类型是指可以给跟具体的类型传递相对不太具体的参数). 泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性. 在引用类型系统时,协变.逆变和不变性具有如下定义. 这些示例假定一个名为 Base 的基类和一个名为 Derived 的派生类.使你能够使用比原

C# 逆变与协变

原文:C# 逆变与协变 该文章中使用了较多的 委托delegate和Lambda表达式,如果你并不熟悉这些,请查看我的文章<委托与匿名委托>.<匿名委托与Lambda表达式>以便帮你建立完整的知识体系. 在C#从诞生到发展壮大的过程中,新知识点不断引入.逆变与协变并不是C#独创的,属于后续引入.在Java中同样存在逆变与协变,后续我还会写一篇Java逆变协变的文章,有兴趣的朋友可以关注一下. 逆变与协变,听起来很抽象.高深,其实很简单.看下面的代码: class Person {

泛型之逆变和协变总结

泛型之逆变和协变总结 c# 泛型 逆变 协变 变的概念 协变(Foo<父类> = Foo<子类> ) 逆变(Foo<子类> = Foo<父类>) 逆变与协变的相互作用 变的概念 //父类 = 子类 string str = "string";  object obj = str;//变了  协变(Foo<父类> = Foo<子类> ) //泛型委托: public delegate T MyFuncA<T&g

[C#]浅谈协变与逆变

看过几篇说协变与逆变的博客,虽然都是正确无误的,但是感觉都没有说得清晰明了,没有切中要害.那么我也试着从我的理解角度来谈一谈协变与逆变吧. 什么是协变与逆变 MSDN的解释:https://msdn.microsoft.com/zh-cn/library/dd799517.aspx 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型.泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供

C# - 协变与逆变

public interface IFication<T>{    void Method1 ( T t );    T Method2();} public class Parent : IFication<Parent>{    public string Car="阿斯顿马丁";  // 父亲具有车子 public void Method1 ( Parent p )    {        Console.WriteLine ( p.Car );    }

逆变与协变详解

逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画图详细解析逆变与协变. 变的概念 我们都知道.Net里或者说在OO的世界里,可以安全地把子类的引用赋给父类引用,例如: 1 2 3 //父类 = 子类 string str = "string"; object obj = str;//变了 而C#里又有泛型的概念,泛型是对类型系统的进一步抽象,比

EF中逆变和协变

EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS user = new HKSJ_USERS(); user.LoginName = "ssss"; user.Mail = "ssss"; user.PassWord = "ssss"; user.Plane = "ssss";

协变和逆变

具体可以参考:<Effective Java>PECS 原则 (producser-extends, consumer-super) G[+A]类似一个生产者,提供数据.(大部分情况下称G为容器类型)G[-A] 是一个消费者,主要用来消费数据.(如上的 Equiv[-A] (其实就是个A => Boolean的函数,即Function1[-A, Boolean])) 同理函数的参数为何声明为逆变,返回值为协变就好理解了同理class G[+A]{def fun[B >: A](x:

Scala 协变 和 逆变

在Scala(以及其他许多编程语言)中,函数也是对象,可以使用.定义其他对象的地方,也可以使用.定义函数.Scala中的函数,具有apply方法的类的实例,就可以当做函数来使用.其中apply接受的参数就是函数的参数,而apply的返回值就是函数的返回值. 首先给出一个接受一个参数的函数的泛型定义. trait Function1[-T, +U] {   def apply(x: T): U } 这种函数接受一个参数,参数类型为泛型类型T,返回类型为泛型类型U.和其他支持泛型的语言一样,实际定义