委托中的协变和逆变(C# 编程指南)
2009-03-05 15:13
351 查看
将方法签名与委托类型匹配时,协变和逆变可以提供一定程度的灵活性。协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。 (这句话太难理解了)
示例 1(协变)
复制代码
示例 2(逆变)
复制代码
示例 1(协变)
说明
本示例演示如何将委托与具有返回类型的方法一起使用,这些返回类型派生自委托签名中的返回类型。由 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; } }
示例 2(逆变)
说明
本示例演示如何将委托与具有某个类型的参数的方法一起使用,这些参数是委托签名参数类型的基类型。通过逆变,以前必须使用若干个不同处理程序的地方现在只要使用一个事件处理程序即可。如,现在可以创建一个接收 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; }
相关文章推荐
- 委托中的协变和逆变(C# 编程指南)
- 委托中的协变和逆变(C# 编程指南)
- 委托中的协变和逆变(C# 编程指南)
- C# 4.0新特性-"协变"与"逆变"以及背后的编程思想
- C# 4.0新特性-"协变"与"逆变"以及背后的编程思想
- 带有命名方法的委托与带有匿名方法的委托(C# 编程指南)
- 委托(C# 编程指南)
- 委托(C# 编程指南)
- C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型
- 如何:合并委托(多路广播委托)(C# 编程指南)
- 如何:声明、实例化和使用委托(C# 编程指南)GOOD
- 委托(C# 编程指南)
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- C#委托及其有趣的协变、逆变
- 如何:声明、实例化和使用委托(C# 编程指南)
- 委托匿名方法(C# 编程指南)
- 何时使用委托而不使用接口(C# 编程指南)
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- c# 委托 协变和逆变
- C# 4.0新特性——“协变”与“逆变”以及背后的编程思想