zoukankan      html  css  js  c++  java
  • C#匿名方法与Delegate类型转换错误

    问题描述

    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});

  • 相关阅读:
    2018.12.17-dtoj-1174-出现或反转后出现在每个字符串中的最长子串
    2018.12.17-dtoj-1173-每个字符串至少出现两次且不重叠的最长子串
    2018.12.17-dtoj-1171-长度不小于k的公共子串的个数
    2018.12.17-dtoj-1170-最长公共子串
    2018.12.17-dtoj-1168-连续重复子串
    欧拉四面体公式
    超级密码 hdu1226 bfs
    糖果大战 hdu1204
    Find The Multiple (poj1426 一个好的做法)
    Life Forms (poj3294 后缀数组求 不小于k个字符串中的最长子串)
  • 原文地址:https://www.cnblogs.com/sjqq/p/7016084.html
Copyright © 2011-2022 走看看