C# 抗变与协变的理解】的更多相关文章

我们知道 方法的参数是协变的: void display(shape o) 如果类Rectangle 继承于shape类,那我们可以给该方法传入Rectangle类的实例. 而方法的返回类型是抗变的,当方返回一个shape类型时,我们不能把他赋值给一个rectangle类型. (在这儿 子类当做父类使用,而父类不能当做子类使用)…
C#泛型的抗变与协变 学习自 C#本质论6.0 https://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html Overview 一直以来,被抗变与协变的定义搞得头昏脑涨掰持不清,如果在加上泛型在其中作祟,就更加两眼发懵了.所以就暂时略过了这一拦路虎,但是今天在学习Kotlin泛型的时候再一次碰到了这里拦路虎,只硬着头皮迎难而上了. 抗边与协变的定义 协变: 子类想父类方向的类型转换称之为协变 //string[] 向 object[…
在.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…
namespace test { // 泛型的协变,T 只能作为返回的参数 public interface Class1<out T> { T Get(); int Count { get; } } public class Class2 : Class1<String> { public String Get() { return ""; } ; } } } // 泛型的抗变,T在方法中只能作为传入参数 public interface Class3<…
今天回忆了之前看的<深入理解C#>这本书中的泛型章节,其中对泛型的可变性的理解.泛型可变性分两种:协变和逆变.逆变也又称为抗变. 怎么理解这两个名词的意思: ①:协变即为在泛型接口类型中使用out标识的类型参数.协变的字面意思是“与变化的方向相同”②逆变那就是用in来标识的泛型接口类型的类型参数.逆变的字面意思是“与变化的方向相反” 需要注意的是无论是协变还是逆变也只能在泛型接口中来使用. 先来举个基本的例子,来加强你对可变性的理解.在C#中有隐式类型转换,比如: string str = &…
JQuery选择器大全   jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement")    选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div")           选择所有的div标签元素,返回div元素数组 $(".myClass")      选择使用myClass类的css的所有元素 $("*&…
1.定义泛型类 可以使用以下语法创建泛型类,T可以是任意符合C#标识符命名规范的任意标识符 class MyGenericClass<T> { //.... } 泛型类可以包含任意多个类型,使用逗号隔开.定义了这些类型之后就可以像其他类型一样使用它们,比如用作成员变量的类型,属性或方法的返回值,方法的参数类型等等.如下把T1用作成员变量的类型.属性的返回值,方法的参数类型. class MyGenericClass<T1, T2, T3> { private T1 innerT1O…
2.3变量 var 类型推断 type 类的分类 如:type nametype = name.GetType(); //取变量name的类型 const 常量  const int painame = 3.1415 char 是字符类型 string是字符串类型 2.5语句 选择语句:switch(变量){case 常量值1:语句1 break;…………;default 常量值n:语句2 break;} 二个值相同语句时:switch(变量){case 常量值1:case 常量值1:语句1 b…
class Program { static void Main(string[] args) { init(); System.Console.ReadKey(); } #region 接口 /// <summary> /// 接口成员是公共的,不能加其他修饰符,如static,public,virtual等 /// </summary> public interface IA { string IStr { get; set; } void IMethod(); } publi…
泛型接口的抗变和协变 https://www.cnblogs.com/yanfang/p/6635302.html ①泛型接口,如果泛型类型前没有关键字out或者in来标注,则该泛型接口不支持抗变和协变,即只能是什么对象指向什么类型. ②如果泛型接口,泛型类型前有关键字out标注,则表示其方法的输出为T类型,也就是方法的返回值.同时该泛型接口支持协变,即,可以用父类的类型指向子类的对象. ③如果泛型接口,泛型类型前面有关键字in标注,则表示其方法的输入为T类型,也就是方法的参数.该泛型接口支持抗…
本节对委托.事件做以总结. 一.委托: 1.概念:先来说明变量和函数的概念,变量,以某个地址为起点的一段内存中所存储的值,函数,以某个地址为起点的一段内存中存储的机器语言指令.有了这2个概念以后,我们来看c++中的函数指针,函数指针就是指向这个函数的地址,函数指针所指向的类型就是函数在内存中的大小,有了这个起点和大小,函数指针就可以代替函数完成对函数的调用.在C#中,委托delegate就是对c++中函数指针做了一个升级,同样它没有直接调用方法采用的是间接调用,是一种类,所以也是一种数据类型.下…
题目 http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html 1.考察对常量和自读字段 初始化过程的了解 static readonly int A = C * D; static readonly int B = 10; const int C = 5; static readonly int D = B * C; static void Main(string[] args) { Co…
关键字out和in相信大家都不陌生,系统定义的很多泛型类型大家F12都或多或少看见了.但是实际中又很少会用到,以前在红皮书里看到,两三页就介绍完了.有的概念感觉直接搬出来的,只是说这样写会怎样,并没有形象的将为什么这么设计,什么时候有用.再加上是翻译的语义很生硬,理解起来很费劲.自然又百度一通,看了一大堆大家各抒己见,这东西还是像一个低分辨率的图片一样,不够清晰.其实现在各种知识点基本都知道大概是怎么回事,怎么用,但是总感觉少点什么,不够高清.于是最近写了个控制台,把各种不够高清或者需要高清显示…
泛型在.NET 2.0中正式的引入.在使用泛型的过程中,联系上面向对象的继承性.往往很容易想当然敲出类似以下代码 List<Animal> animalLst=new List<Dog>; 显然这样编译是不通过的.虽然Dog和Animal之间有继承性,但是List<Animal>和List<Dog>这两个类之间并没有继承性.如果要解决这样的问题,用上协变与抗变(逆变),它们统称为变体.是.NET 4.0引入的新特性,但是早在.NET 2.0就引入了. 变体适…
去年写过一篇博客谈了下我自己对协变和逆变的理解,现在回头看发现当时还是太过“肤浅”,根本没理解.不久前还写过一篇“黑”Java泛型的博客,猛一回头又是“肤浅”,今天学习Java泛型的时候又看到了协变和逆变,感觉又理解了点,记录一下,但不免还是“肤浅”,看了这篇博客的同学,欢迎留言交流下.Markdown 什么是协变和逆变? 到底什么是协变和逆变?先看例子: //Java Object[] objects = new String[2]; //C# object[] objects = new s…
msdn 解释如下: “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型. “逆变”则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样,不过不够直白. 直白的理解: “协变”->”和谐的变”->”很自然的变化”->string->object :协变.  “逆变”->”逆常的变”->”不正常的变化”->object->string 逆变.  上面是个人对协变和逆变的理解,比起记住那些派生,类型,原始指定,更大,更小之类的词语,个人认…
1. 是什么 1.1 协变 协变指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型.如 string 到 object 的转换.多见于类型参数用作方法的返回值. 1.2 逆变 逆变指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型.如 object 到 string 的转换.多见于类型参数用作方法的输入值. 泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性. 2. 怎么理解 假如有一个 sub 子类和 parent 父类,我们可以很轻易地将 sub…
定义 协变:与原始类型转换方向相同的可变性称为协变. 抗变:与派生类型转换方向相同的可变性称为抗变. 补充: 参数是协变的,可以使用派生类对象传入需要基类参数的方法,反之不行 返回值是抗变的,不能使用派生类对象接收返回了基类对象的方法返回值,反之可以 代码展示 public class 协变和抗变 { /// <summary> /// 基类 /// </summary> public class Shape { public double Width { get; set; }…
建议44:理解委托中的协变 委托中的泛型变量天然是部分支持协变的.为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHanlder<T>(string name); static void Main() { GetEmployeeHanlder<Employee> getAEmployee = GetAManager; Employee e = getAEmployee("Mike"…
http://www.cnblogs.com/qixuejia/p/4383068.html 深入理解 C# 协变和逆变   msdn 解释如下: “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型. “逆变”则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样,不过不够直白. 直白的理解: “协变”->”和谐的变”->”很自然的变化”->string->object :协变.  “逆变”->”逆常的变”->”不正常的变化”->object…
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…
  深入理解 C# 协变和逆变 msdn 解释如下: “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型. “逆变”则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样,不过不够直白. 直白的理解: “协变”->”和谐的变”->”很自然的变化”->string->object :协变.  “逆变”->”逆常的变”->”不正常的变化”->object->string 逆变.  上面是个人对协变和逆变的理解,比起记住那些派生,类型,原始指…
文章目录 函数的参数和返回值 可变类型的变异 在之前的文章中我们简单的介绍过scala中的协变和逆变,我们使用+ 来表示协变类型:使用-表示逆变类型:非转化类型不需要添加标记. 假如我们定义一个class C[+A] {} ,这里A的类型参数是协变的,这就意味着在方法需要参数是C[AnyRef]的时候,我们可以是用C[String]来代替. 同样的道理如果我们定义一个class C[-A] {}, 这里A的类型是逆变的,这就意味着在方法需要参数是C[String]的时候,我们可以用C[AnyRe…
逆变(Contravariance)/协变(Covariance) 1. 基本概念 官方: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型.协变/逆变只支持委托.泛型接口.数组由于历史的原因也支持协变/逆变.在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反.协变允许方法具有的返回类型比接口的泛型类型参数定义的返回类型的派…
在面向对象程序设计中,协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更 "狭窄" 的类型. Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基类方法返回类型的子类.协变返回类型允许返回更为具体的类型.     示例程序如下: import java.io.ByteArrayInputStream; import java.io.InputStream; class Base { //子…
关于协变逆变,SolidMango的解释是比较可取的.有了协变,比如,在需要返回IEnumerable<object>类型的时候,可以使用IEnmerable<string>来替代:有了逆变,比如,在需要接收IComparable<string>类型形参方法中,可以使用IComparable<object>类型实参来替代. 协变 先来体会协变.有2个具有继承关系的父类和子类. public class Animal { public string Name…
首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的输入流的ZIP压缩流对象[原有流对象不会改变] /// </summary> /// <param name="sourceStream"></param> /// <returns></returns> public stati…
前言 本篇继续讲解泛型.上一篇讲解了泛型类的定义细节.本篇继续讲解泛型接口. 泛型接口 使用泛型可定义接口,即在接口中定义的方法可以带泛型参数.然后由继承接口的类实现泛型方法.用法和继承泛型类基本没有区别. 不变.协变和逆变 在.Net4.0之前,泛型接口是不变的..Net4.0通过协变和逆变为泛型接口和泛型委托增加了重要的扩展. 注:本书总体非常好,但在协变和逆变方面,我认为是有缺陷的.我一直偏好通过读书籍来了解技术,而不是逛论坛,但协变和逆变的问题我研究了本书多次,都没搞懂而放弃了,反正平时…
0. 文章目的:   介绍变体的概念,并介绍其对C#的意义 1. 阅读基础   了解C#进阶语言功能的使用(尤其是泛型.委托.接口) 2. 从示例入手,理解变体   变体这一概念用于描述存在继承关系的类型间的转化,这一概念并非只适用于C#,在许多其他的OOP语言中也都有变体概念.变体一共有三种:协变.逆变与不变.其中协变与逆变这两个词来自数学领域,但是其含义和数学中的含义几乎没有关系(就像编程语言的反射和光的反射之间的关系).从字面上来看这三种变体的名字多少有点唬人,但其实际意思并不难理解.广泛…