C#匿名方法与Delegate类型转换错误
2017-06-15 10:19
197 查看
问题描述
C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法:
0 public object Invoke(Delegate method);
1 public IAsyncResult BeginInvoke(Delegate method);
在这种情况下, 如果不使用匿名方法, 则需要在代码的上面先声明一个delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething().
0 delegate void DoSomething();
1
2 private void App()
3 {
4 XXControl.Invoke(new DoSomething(() =>
5 {
6 //DoSomething的具体操作
7 }));
8 }
这样做可以是可以, 但使用匿名方法则更好, 最起码看上去更简洁.
0 private void App()
1 {
2 XXControl.Invoke(delegate
3 {
4 //DoSomething的具体操作
5 });
6 }
上面的代码会在编译的时候出错: Cannot convert anonymous method to type System.Delegate because it is not a delegate type. 方法要求参数的是一个委托(delegate)类型, 而现在传递的只是一个匿名方法. 产生这个错误最根本的原因是编译器在处理匿名方法的时候, 没法推断出这个委托的方法返回的是什么类型, 也就不知道返回一个什么样的委托.
解决方法 要解决上面这个问题, 从根本上来说就是指定这个匿名方法将会返回什么类型的委托, 有几种方法:
1. 使用MethodInvoke或者Action
0 private void App()
1 {
2 XXControl.Invoke((MethodInvoker)delegate()
3 {
4 //DoSomething的具体操作
5 });
6 } 0 private void App()
1 {
2 XXControl.Invoke((Action)delegate()
3 {
4 //DoSomething的具体操作
5 });
6 }
MethodInvoke和Action都是方法返回类型为空的委托.
2. 可以给Control定义一个Invoke的扩展方法
0 public static void Invoke(this Control control, Action action)
1 {
2 control.Invoke((Delegate)action);
3 }
调用的时候则可以这样调用:
0 //使用委托
1 XXControl.Invoke(delegate { //DoSomething here});
2 //使用lambda表达式
3 XXControl.Invoke(()=>{ //DoSomething here});
C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法:
0 public object Invoke(Delegate method);
1 public IAsyncResult BeginInvoke(Delegate method);
在这种情况下, 如果不使用匿名方法, 则需要在代码的上面先声明一个delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething().
0 delegate void DoSomething();
1
2 private void App()
3 {
4 XXControl.Invoke(new DoSomething(() =>
5 {
6 //DoSomething的具体操作
7 }));
8 }
这样做可以是可以, 但使用匿名方法则更好, 最起码看上去更简洁.
0 private void App()
1 {
2 XXControl.Invoke(delegate
3 {
4 //DoSomething的具体操作
5 });
6 }
上面的代码会在编译的时候出错: Cannot convert anonymous method to type System.Delegate because it is not a delegate type. 方法要求参数的是一个委托(delegate)类型, 而现在传递的只是一个匿名方法. 产生这个错误最根本的原因是编译器在处理匿名方法的时候, 没法推断出这个委托的方法返回的是什么类型, 也就不知道返回一个什么样的委托.
解决方法 要解决上面这个问题, 从根本上来说就是指定这个匿名方法将会返回什么类型的委托, 有几种方法:
1. 使用MethodInvoke或者Action
0 private void App()
1 {
2 XXControl.Invoke((MethodInvoker)delegate()
3 {
4 //DoSomething的具体操作
5 });
6 } 0 private void App()
1 {
2 XXControl.Invoke((Action)delegate()
3 {
4 //DoSomething的具体操作
5 });
6 }
MethodInvoke和Action都是方法返回类型为空的委托.
2. 可以给Control定义一个Invoke的扩展方法
0 public static void Invoke(this Control control, Action action)
1 {
2 control.Invoke((Delegate)action);
3 }
调用的时候则可以这样调用:
0 //使用委托
1 XXControl.Invoke(delegate { //DoSomething here});
2 //使用lambda表达式
3 XXControl.Invoke(()=>{ //DoSomething here});
相关文章推荐
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0中的匿名方法
- c# 匿名方法學習
- C#的匿名方法
- C# 2.0 匿名方法与 Windows Forms 异步调用
- C#强化系列文章四:匿名方法的使用
- c#2.0新特性:(二)匿名方法(Anonymous Methods)
- c#里的 方法回调 和匿名方法
- C#匿名方法的应用二则–实现异常Retry机制和WinForm线程安全访问
- 对C# 2.0中匿名方法的怀疑分析
- C# 2.0 匿名方法、迭代器(选择自 shoutor 的 Blog )
- 对C# 2.0中匿名方法的怀疑分析
- c#2.0的新功能(三):分部类、匿名方法等
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0 Specification(匿名方法)(二)
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- [转]C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C#2.0技术探讨(1):匿名方法