委托中的协变和逆变(C# 编程指南)

C# 中的协变与逆变 在 C# 中,协变(Covariance)和逆变(Contravariance)是两个重要的概念,主要用于处理泛型类型参数的可变性。这两个概念允许在泛型类型之间进行更灵活的转换,提高了代码的可重用性和灵活性。协变允许将一个派生类型的泛型参数转换为基类型的泛型参数。简单来说,如果有两个泛型接口IFoo和IBar,并且IFoo的泛型参数T是协变的,那么如果A是B的派生类,就可以将IFoo转换为IFoo。逆变允许将一个基类型的泛型参数转换为派生类型的泛型参数。如果有两个泛型接口IFoo和IBar 阅读详情
重要说明 此文档可能不是当前开发最佳做法的代表,下载链接和其他资源可能不再有效。当前推荐的版本可从此处获得。 ArchiveDisclaimer


Visual Studio 2005

将方法签名与委托类型匹配时,协变和逆变为您提供了一定程度的灵活性。协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。

本示例演示如何将委托与具有返回类型的方法一起使用,这些返回类型派生自委托签名中的返回类型。由 SecondHandler 返回的数据类型是 Dogs 类型,它是由委托中定义的 Mammals 类型派生的。

C#
class Mammals
{
}

class Dogs : Mammals
{
}

class Program
{
    // Define the delegate.
    public delegate Mammals HandlerMethod();

    public static Mammals FirstHandler()
    {
        return null;
    }

    public static Dogs SecondHandler()
    {
        return null;
    }

    static void Main()
    {
        HandlerMethod handler1 = FirstHandler;

        // Covariance allows this delegate.
        HandlerMethod handler2 = SecondHandler;
    }
}

本示例演示如何将委托与具有某个类型的参数的方法一起使用,这些参数是委托签名参数类型的基类型。通过逆变,以前必须使用若干个不同处理程序的地方现在只要使用一个事件处理程序即可
。如,现在可以创建一个接收 EventArgs 输入参数的事件处理程序,然后,可以将该处理程序与发送 MouseEventArgs 类型(作为参数)的 Button.MouseClick 事件一起使用,也可以将该处理程序与发送 KeyEventArgs 参数的 TextBox.KeyDown 事件一起使用。

C#
System.DateTime lastActivity;
public Form1()
{
    InitializeComponent();

    lastActivity = new System.DateTime();
    this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
    this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs

}

// Event hander for any event with an EventArgs or
// derived class in the second parameter
private void MultiHandler(object sender, System.EventArgs e)
{
    lastActivity = System.DateTime.Now;
}

2023年GESP12月认证C++五级真题解析 例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。 阅读详情

相关推荐

Android自动化新方案:ESP32-C3蓝牙HID模拟触控与手势操作实战(附源码)

本文详细介绍了使用ESP32-C3通过蓝牙HID协议实现Android设备自动化操作的完整方案。该硬件方案成本低廉且能完美规避系统风控,可模拟鼠标移动、点击及复杂手势操作,延迟低于50毫秒,适用于游戏连招和应用测试等场景。文章包含完整的源码实现和性能优化技巧。

kotlin6android的博客 378

泛型接口、泛型委托的协变(out)与逆变(in)

部分借鉴自:https://blog.youkuaiyun.com/sudazf/article/details/17148971 首先回顾一下已经学过的内容,我们可以将派生类对象的实例赋值给基类的变量,这叫做赋值兼容,例如以下代码。 class Animal { public int NumberOfLegs = 4; } class Dog:Anima...

寂蝶难双,窃窃思羽. 1566

51单片机+HX711电子秤Proteus仿真保姆级教程(附完整源码与避坑指南)

本文详细介绍了51单片机与HX711电子秤在Proteus仿真中的全流程实战指南,包括电路设计、核心代码实现、典型问题排查及系统集成等关键步骤。特别提供了HX711驱动程序的编写技巧和称重数据处理算法,帮助开发者快速搭建高精度电子秤仿真系统,并避免常见的设计陷阱。

weixin_30752699的博客 415

C#泛型与委托中的协变out与逆变in简记

引用类型支持泛型类型参数中的协变和逆变,但值类型不支持它们。仅在类型定义方法参数的类型,而不是方法返回类型时,类型可以在泛型接口或委托中声明为逆变。数组的协变使派生程度更大的类型的数组能够隐式转换为派生程度更小的类型的数组。在泛型委托中,如果类型仅用作方法返回类型,而不用于方法参数,则可以声明为协变。在泛型委托中,如果类型仅用作方法参数,而不用于方法返回类型,则可以声明为逆变。分配相同类型的其他委托,不过要使用派生程度更大的泛型类型参数。分配相同类型的其他委托,不过要使用派生程度更小的泛型类型参数。

天富儿的博客 2782

图形化界面无限转圈?CentOS 7的SELinux避坑指南(附命令行修复实录)

本文详细解析了CentOS 7图形界面启动时无限转圈或卡在'starting switch root'的故障原因,主要与SELinux安全策略冲突有关。提供了三种修复方案:临时禁用SELinux、重装策略包和精细调整策略,并分享了长期维护建议,帮助用户平衡系统安全性与可用性。

potato的博客 799

Dify学习笔记-知识库(六)

Dify学习笔记-知识库

大数据知识梳理 2万+

C#-弄懂泛型和协变、逆变

C#-弄懂泛型和协变、逆变 脑图概览# 泛型声明和使用# 协变和逆变# 《C#权威指南》上在委托篇中这样定义: 协变:委托方法的返回值类型直接或者间接地继承自委托前面的返回值类型; 逆变:委托签名中的参数类型继承自委托方法的参数类型; 在泛型篇中这样定义: 协变:泛型参数定义的类型只能作为方法的返回类型,不能作为方法的参数类型,且该类型直接或者间接地继承自接口方法的返回值类型;可以使用out关键字声明协变参数。 逆变:泛型参数定义的类型只能作为方法参数的类型,不能作为返回值类型,且该类型是接口方法的

进击的前端小白 853

IDEA+JRebel实现SpringBoot+MyBatis Plus项目热部署全攻略(含XML热更新实战)

本文详细介绍了如何在IDEA中使用JRebel为SpringBoot与MyBatis Plus项目配置高效的热部署方案。通过安装激活JRebel插件并配置关键扩展,重点解决了MyBatis XML映射文件修改后无法即时生效的痛点,实现了Java代码与XML文件的秒级热更新,从而彻底摆脱频繁重启应用的开发困境,大幅提升编码与调试效率。

weixin_28831341的博客 472

图解C#高级教程(四):协变、逆变

本章的主题是可变性(variance),这里的可变性更多的是指基类和派生类之间的转换。可变性分为三种:协变(covariance)、逆变(contravariance)和不变(invariance)。

聚焦C++/Python编程语言、大模型应用开发 2699

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2028

PyTorch深度学习实战(7)——批大小对神经网络训练的影响

在神经网络中,批( batch )是指一次输入网络进行训练或推断的一组样本。批处理( batch processing )是指将这一组样本同时输入网络进行计算的操作。本节中首先介绍批( Batch )的基本概念,并且介绍批大小在神经网络训练过程中的影响。

盼小辉丶的博客 1万+

Linux硬件监控基石:lm_sensors温度电压风扇精准采集实战

硬件传感器监控是Linux系统稳定性保障的基础能力,其核心在于绕过ACPI抽象层、直连I2C/SMBus总线读取芯片寄存器的底层机制。lm_sensors通过内核驱动模块(如it87、nct6775)、用户空间库(libsensors)与命令行工具(sensors)构成三层架构,实现对温度、电压、风扇转速等物理量的标准化采集与校准。相比/sys/class/thermal或acpi -t等依赖固件的方案,它具备更强的硬件兼容性与数据真实性,尤其适用于国产化平台、老旧服务器及嵌入式ARM设备。本文聚焦lm_s

weixin_33851604的博客 354

2024-江苏科技大学-模拟-动态接触角,模拟液滴撞击,comsol软件模拟。

相反,其对液滴粘度和平衡接触角的变化基本不敏感。重力势能的影响显著受过程参数调节,随着液滴直径和密度的增加而增加,而随着初始液滴速度和表面张力系数的增加而减小。通过考虑形状因子和粘度修正因子,可以准确定义表面能和粘性耗散能,使得所提出的半经验修正勺状模型表现出良好的性能,在所有65个研究案例中,液滴最大铺展长度因子(βmax)和中心厚度(h)的相对误差基本分别落在5%和10%的区间内。重力势能的影响受过程参数显著调节,随液滴直径和密度的增大而增大,随液滴初始速度和表面张力系数的增大而减小。

qq_15963745的博客 512

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C#中的委托delegate

委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联。你可以通过委托调用方法。委托用于将方法参数传递给其它方法。事件处理程序就是通过委托调用的方法(这是MSDN中对委托的解释)。个人感觉C#中委托类似于C++中的函数指针,但委托又是一种特殊的类,只有方法的类。 在C#中使用委托时,需要经过这两个步骤,首先定义要使用的委托,对于委托定义它就是告诉编译器这种类型的委托表示哪种类型的方法

给永远比拿愉快 2013

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

c# 中的协变和逆变

c# 中的协变和逆变 网上的大多数资料,讲的太复杂了,也没讲的特别明白; 不过俺,算你明白了,不告诉你~ 转载于:https://www.cnblogs.com/mc67/p/8136977.html

weixin_30849591的博客 79

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Covariance and Contravariance (C#)

Covariance and Contravariance (C#) https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/concepts/covariance-contravariance/ In C#, covariance and contravariance enable implic...

weixin_30883271的博客 115

C# 委托-delegate

C# 委托-delegate 委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示:public delegate int PerformCalculation(int x, int y);委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构...

LHL62411570的专栏 127

C# 泛型中的协变和逆变

💎协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性。在引用类型系统时,协变、逆变和不变性具有如下定义。这些示例假定一个名为Base的基类和一个名为Derived的派生类。Covariance使你能够使用比原始指定的类型派生程度更大的类型。你可以将的实例分配给类型的变量。

李赛赛的专栏 1719

C#中的协变与逆变

一:什么是协变与逆变 协变指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,逆变指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型只有泛型接口和泛型委托参数支持协变和逆变 二:引言 using System; using System.Collections.Generic; class MainClass { static void Main() { object o = "str"; List<object&g.

L的博客 5426

谈谈我对C#协变和逆变的理解

然后我们在程序中可以这么调用,我们用Person去接受一个Student,这是非常好理解的,从面向对象继承的角度来讲完全合理,因为我需要一个人Person,你给了我一个学生Student。注意这个委托的泛型T使用了out关键字,表示这个委托的参数T是支持协变的。这两个方法的声明和委托的声明保持一致。当然你应该看不懂这个公式,没关系,这边文章将会循序渐进的给大家介绍协变和逆变的概念,以及协变和逆变是为了解决什么问题。以上就是逆变的介绍,简单点说,就是将一个父类型的委托或者接口转换成子类型的委托或者接口。

曹瑞鹏的博客(专注于.NET开发,Unity开发) 2052

C# 泛型(协变和逆变)

纵观本章,大家已经看到了,如果你创建泛型类型的实例,编译器会接受泛型类型声明以及类型实参来创建构造类型。但是,大家通常会犯的一个错误就是将派生类型的委托分配给基类型委托的变量。下面来看一下这个主题,这叫作可变性(variance)。它分为三种一一一协变(convariance)、逆变(contravariance)和不变(invariance)。

钢铁男儿 1186
上一篇: 何时使用委托而不使用接口(C# 编程指南)
下一篇: 使用迭代器(C# 编程指南)
Bill11YAng
博客等级 码龄14年 165粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值