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.KeyPress += LogPlainEvent;
 6 //public delegate void MouseEventHandler(object sender, MouseEventArgs e);
 7 button.MouseClick += LogPlainEvent;
 8
 9 public void LogPlainEvent(object sender, EventArgs e)
10 {
11 }

协变性

只要返回值类型与委托兼容,就能创建委托实例

 1 public delegate Stream StreamFactory();
 2
 3 public MemoryStream GenerateData()
 4 {
 5     return new MemoryStream();
 6 }
 7
 8 StreamFactory factory = GenerateData;
 9 using (Stream stream = factory())
10 {
11     int data;
12     while((data = stream.ReadByte()) != -1)
13     {
14         Console.WriteLine(data);
15     }
16 }  

原文地址:https://www.cnblogs.com/love-me-love-my-code/p/10556095.html

时间: 2024-10-13 15:05:58

C#委托的协变性和逆变性的相关文章

协变性和逆变性

1.协变性是指方法能返回从委托的返回类型派生的一个类型. 2.逆变性是指方法获取的参数可以是委托的参数类型的基类. =================================分割线================================= delegate Object MyCallback(FileStream s); string SomeMethod(Stream s); 如上面的例子,SomeMethod 的返回类型(string)派生自委托的返回类型(Object):这

Java 协变性、逆变性 [转]

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

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

.Net中委托的协变和逆变详解

关于协变和逆变要从面向对象继承说起.继承关系是指子类和父类之间的关系:子类从父类继承所以子类的实例也就是父类的实例.比如说Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是Dog,那么他必然是Animal. 协变逆变正是利用继承关系 对不同参数类型或返回值类型 的委托或者泛型接口之间做转变.我承认这句话很绕,如果你也觉得绕不妨往下看看. 如果一个方法要接受Dog参数,那么另一个接受Animal参数的方法肯定也可以接受这个方法的参数,这是Animal向Dog方向的转变是逆变

匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的

0x00 前言 由于工作繁忙所以距离上一篇博客已经过去一个多月的时间了,因此决心这个周末无论如何也得写点东西出来,既是总结也是分享.那么本文主要的内容集中在了委托的使用以及内部结构(当然还有事件了,但是受制于篇幅故分为两篇文章)以及结合一部分Unity3D的设计思考.当然由于时间仓促,文中难免有一些疏漏和不准确,也欢迎各位指出,共同进步. 0x01 从观察者模式说起 在设计模式中,有一种我们常常会用到的设计模式——观察者模式.那么这种设计模式和我们的主题“如何在Unity3D中使用委托”有什么关

C#复习笔记(2)--C#1所搭建的核心基础

通过对C#1所搭建的核心基础的深入了解,可以知道之后的C#版本在C#1的基础上做了很多扩展,而这些扩展都是基于C#搭建的核心基础而来的. 委托 一.编写委托的过程 委托经常和C语言的"函数指针"挂钩.委托是方法参数化.函数式语言一个重要的表达方式.C#1中编写一个委托要经过四部: 1.声明委托类型 delegate void StringProcessor(string param1); 这个委托指定了一种无返回值,有一个string类型的参数的方法. 这个委托继承自System.Mu

浅谈 C#委托

看了<CLR via C#>的17章委托后,为自己做一点浅显的总结,也分享给需要的人. .NET通过委托来提供一种回调函数机制,.NET委托提供了很多功能,例如确保回调方法是类型安全的(CLR重要目标).委托好允许顺序调用多个方法(委托链),并且支持调用静态方法和实例方法. 委托的基本语法就不多说了. internal delegate void Feedback(int value); public sealed class Program{ publick static void Main

读书笔记—CLR via C#委托和attribute

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 委托 类型安全的回调函数,函数签名定义声明.指向静态或实例方法 派生自System.MulticastDelegate的类 将方法绑定到委托时,C#和CLR都允许引用类型的协变性和逆变性 协变性指方法能返回从委托的返回类型派生的类型 逆变性是指