[C#] 委托与方法组
2013-09-22 09:06
211 查看
在编写委托相关代码,尤其是泛型委托相关代码的时候,经常会遇到下面这种问题:
定义一个委托类型:
定义一个测试用的类,及方法:
测试用的代码:
然后会发现,上面的测试用代码有编译错误,其中第二行的编译错误是“无法从方法组转换为System.Delegate”,第三行的编译错误是“无法从用法中推导出TestClass.TestFunc2<T>(TestDelegate<T>)的类型实参”。
以上报错的核心问题就在“方法组”上。“方法组”是一个编译器概念,由于C#支持方法重载,所以名字相同的方法可能会有多种重载实现方式,这所有的名称相同的重载方法合在一起就成为一个方法组。上面的例子中tc.TestFunc4Delegate实际上指向的是名为Test4Delegate的方法组,尽管上面的类定义中并没有对Test4Delegate做任何重载,它依然是一个方法组。
既然是方法组,那么问题就来了——无法确定需要的到底是方法组中的哪一个重载。正因为确定不了,所以编译器无法决定用什么委托子类型来创建委托实例,同样也就无法推导出泛型的正确类型。
想要让上例中的调用可以通过编译,就必须指定限定类型,如这样:
定义一个委托类型:
public delegate void TestDelegate<T>(T arg);
定义一个测试用的类,及方法:
public class TestClass { public void TestFunc4Delegate(int arg){} public void TestFunc1(Delegate dele){} public void TestFunc2<T>(TestDelegate<T> dele){} }
测试用的代码:
1. TestClass tc = new TestClass(); 2. tc.TestFunc1(tc.TestFunc4Delegate); 3. tc.TestFunc2(tc.TestFunc4Delegate);
然后会发现,上面的测试用代码有编译错误,其中第二行的编译错误是“无法从方法组转换为System.Delegate”,第三行的编译错误是“无法从用法中推导出TestClass.TestFunc2<T>(TestDelegate<T>)的类型实参”。
以上报错的核心问题就在“方法组”上。“方法组”是一个编译器概念,由于C#支持方法重载,所以名字相同的方法可能会有多种重载实现方式,这所有的名称相同的重载方法合在一起就成为一个方法组。上面的例子中tc.TestFunc4Delegate实际上指向的是名为Test4Delegate的方法组,尽管上面的类定义中并没有对Test4Delegate做任何重载,它依然是一个方法组。
既然是方法组,那么问题就来了——无法确定需要的到底是方法组中的哪一个重载。正因为确定不了,所以编译器无法决定用什么委托子类型来创建委托实例,同样也就无法推导出泛型的正确类型。
想要让上例中的调用可以通过编译,就必须指定限定类型,如这样:
tc.TestFunc1((TestDelegate<int>)tc.TestFunc4Delegate); tc.TestFunc2<int>(tc.Test4Delegate);
相关文章推荐
- C#中的委托,匿名方法和Lambda表达式(转载)
- .Net (C#)委托和事件(将方法作为方法的参数)
- C#中的委托,匿名方法和Lambda表达式
- C#基础精华07(委托事件,委托的使用,匿名方法)
- 最简单的C#委托实现方法
- c#匿名方法调用委托
- C# 委托:把方法组合到一个数组中使用
- 泛型委托 Predicate/Func/Action ,c#扩展方法
- [C# 基础知识系列]专题三:如何用委托包装多个方法——委托链
- C#基础知识--委托,匿名方法,Lambda
- C# :线程中操作多控件 (委托实现异步及同步的方法)
- C#中被委托的方法必须是静态的吗?
- C# 委托 事件 匿名方法
- C#委托本质探索 七、方法变量作为函数参数传递
- C#笔记 委托 事件 匿名方法 Action
- C#字段、属性、方法、委托
- C# - 委托_ 匿名方法
- C#源代码—声明委托,通过委托对象调用所指向的方法
- [C# 基础知识系列]专题三:如何用委托包装多个方法——委托链
- C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法