[C#] 委托与方法组
2014-03-10 13:20
197 查看
在编写委托相关代码,尤其是泛型委托相关代码的时候,经常会遇到下面这种问题:
定义一个委托类型:
定义一个测试用的类,及方法:
测试用的代码:
然后会发现,上面的测试用代码有编译错误,其中第二行的编译错误是“无法从方法组转换为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#调用COM组件
- c#中虚函数的相关使用方法
- 浅析C# web访问mysql数据库-整理归纳总结
- C# IP地址与整数之间转换的具体方法
- C#中的多态深入理解
- C#实现的阴历阳历互相转化类实例
- C# 的关键字详细介绍
- c# 获得局域网主机列表实例
- C#基本概念列举详解
- C#中Convert.ToInt32()和int.Parse()的区别介绍
- C#面向对象特征的具体实现及作用详解
- c#静态方法和非静态方法详细介绍
- 关于C# Math 处理奇进偶不进的实现代码
- C#中调用Windows API的技术要点说明
- c# 随机函数的使用详解
- c#之圆形无标题栏椭圆窗体的实现详解
- C#页面之间跳转功能的小结
- 浅析C# 基础语法的使用
- C#中将字符串转换为整型的三种解决方法总结
- 深入c# GDI+简单绘图的具体操作步骤(一)