协变性和逆变性

1、协变性是指方法能返回从委托的返回类型派生的一个类型。

2、逆变性是指方法获取的参数可以是委托的参数类型的基类。

=================================分割线=================================

delegate Object MyCallback(FileStream s);
string SomeMethod(Stream s);

如上面的例子,SomeMethod 的返回类型(string)派生自委托的返回类型(Object);这种协变性是允许的。SomeMethod 的参数类型(Stream)是委托的参数类型(FileStream)的基类;这种逆变性是允许的。

=================================分割线=================================

注意:只有引用类型才支持协变性与逆变性,值类型或void不支持。所以不能把下面的方法绑定到MyCallBack委托:

int SomeOtherMethod(Stream s);

虽然 SomeOtherMethod 的返回类型(int)派生自MyCallback的返回类型(Object),但这种形式的协变性是不允许的,因为int是值类型。显然,值类型和void之所以不支持,是因为它们的存储结构是变化的,而引用类型的存储结构始终是一个指针。

时间: 2024-11-05 08:22:05

协变性和逆变性的相关文章

Java 协变性、逆变性 [转]

n  协变性.逆变性和无关性 在面向对象的计算机程序语言中,经常涉及到类型之间的转换,例如从具体类小猫到动物之间的类型转换(上行转换),或者从形状向三角形之间的转换(下行转换). 协变性(covariance).逆变性(contravariance)和无关性(invariant).他们都是用来描述类型转换的性质的术语,形式化的描述如下: 如果A和B是类型,f表示类型转换,≤表示子类型关系,(例如A≤B,表示A是B的子类)那么: 如果A≤B 则f(A) ≤ f(B) 那么f是协变的 如果A≤B 则

C#委托的协变性和逆变性

逆变性 只要函数参数与委托兼容,就能创建委托实例. 1 Button button = new Button(); 2 //public delegate void EventHandler(object sender, EventArgs e); 3 button.Click += LogPlainEvent; 4 //public delegate void KeyPressEventHandler(object sender, KeyPressEventArgs e); 5 button.

c#中关于协变性和逆变性(又叫抗变)详解

今天回忆了之前看的<深入理解C#>这本书中的泛型章节,其中对泛型的可变性的理解.泛型可变性分两种:协变和逆变.逆变也又称为抗变. 怎么理解这两个名词的意思: ①:协变即为在泛型接口类型中使用out标识的类型参数.协变的字面意思是"与变化的方向相同"②逆变那就是用in来标识的泛型接口类型的类型参数.逆变的字面意思是"与变化的方向相反" 需要注意的是无论是协变还是逆变也只能在泛型接口中来使用. 先来举个基本的例子,来加强你对可变性的理解.在C#中有隐式类型转

委托参数的逆变性

读了深入理解C#书中的 5.3.1 委托参数的逆变性,记录一下. 先看一段代码: public Form1() { InitializeComponent(); Button button1 = new Button {Text = "Click me 1", Location = new Point(22, 49)}; Button button2 = new Button {Text = "Click me 2", Location = new Point(10

协变、逆变与不变:数组、泛型、与返回类型

转自:http://blog.csdn.net/yi_Afly/article/details/52071260 1. 前言 之前几篇博文,有些地方涉及到了协变性.逆变性与不变性在Java中的表现,所以这篇博文将重点记录这方面的内容,并辅以JDK源码中的一些实例,加以说明. 2. 定义 这里讨论的协变.逆变与不变都是编程语言中的概念.下面介绍定义: 若类A是类B的子类,则记作A ≦ B.设有变换f(),若: 当A ≦ B时,有f(A)≦ f(B),则称变换f()具有协变性. 当A ≦ B时,有f

协变和逆变(转载)

前言 个人感觉协变(Covariance)与逆变(Contravariance)是 C# 4 中最难理解的一个特性了,因为 C# 4 用了一个非常直观的语法(in和out关键字),在很多情况下,这似乎很简单,in用于输入的参数,out用于输出的返回值,但事实上不完全如此,比如Method(Action<T> action)(会让人抓狂,一会再说).这也是困扰了我相当久的问题,所以今天打算分享一下我自己的理解. 协变和逆变 我们先引入一些记号,假设 T 和 U 是两个类型,那它们之间会有几种关系

Java中的逆变与协变(转)

看下面一段代码 Number num = new Integer(1); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch List<? extends Number> list = new ArrayList<Number>(); list.add(new Integer(1)); //error list.add(new Float(1.2f)); //error 有人会

那些年搞不懂的术语、概念:协变、逆变、不变体

简述什么是协变性.逆变性.不变性 协变性,如:string->object (子类到父类的转换) 逆变性,如:object->string (父类到子类的转换) 不变性,基于上面两种情况,不可变.具体下面再做分析. 泛型委托的可变性 先使用框架定义的泛型委托Func和Action做例子(不了解的请戳) 协变:(string->object) Func<string> func1 = () => "农码一生"; Func<object> f

泛型--协变与逆变(转)

对于泛型的知识,一直比较模糊,现在有机会整理一下,突发发现C#还有很多你不知道的东东,继续.NET FrameWork中泛型的协变与逆变: 1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如果某个返回的类型可以由其派生类型替换,那么这个类型就是支持协变的 如果某个参数类型可以由其基类替换,那么这个类型就是支持逆变的. 2. C# 4.0对泛型可变性