本文主要是介绍委托中的协变和逆变(C# 编程指南),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
重要说明 | 此文档可能不是当前开发最佳做法的代表,下载链接和其他资源可能不再有效。当前推荐的版本可从此处获得。 ArchiveDisclaimer |
将方法签名与委托类型匹配时,协变和逆变为您提供了一定程度的灵活性。协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。
示例 1(协变)
本示例演示如何将委托与具有返回类型的方法一起使用,这些返回类型派生自委托签名中的返回类型。由 SecondHandler 返回的数据类型是 Dogs 类型,它是由委托中定义的 Mammals 类型派生的。
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;} }
示例 2(逆变)
本示例演示如何将委托与具有某个类型的参数的方法一起使用,这些参数是委托签名参数类型的基类型。通过逆变,以前必须使用若干个不同处理程序的地方现在只要使用一个事件处理程序即可 。如,现在可以创建一个接收 EventArgs 输入参数的事件处理程序,然后,可以将该处理程序与发送 MouseEventArgs 类型(作为参数)的 Button.MouseClick 事件一起使用,也可以将该处理程序与发送 KeyEventArgs 参数的 TextBox.KeyDown 事件一起使用。
System.DateTime lastActivity; public Form1() {InitializeComponent();lastActivity = new System.DateTime();this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgsthis.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; }
这篇关于委托中的协变和逆变(C# 编程指南)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!