【问题标题】:Cannot convert lambda expression to type delegate because delegate is not a type无法将 lambda 表达式转换为类型委托,因为委托不是类型
【发布时间】:2018-04-12 00:52:07
【问题描述】:

我遇到了一个我似乎无法弄清楚的问题,尽管这是 StackOverflow 上的一个标准问题。

base.Invoke(() => prgWork.Value = 100);

我做错了什么? 当我编译它时,我收到错误消息:

无法将 lambda 表达式转换为类型委托,因为委托不是类型

【问题讨论】:

    标签: c#


    【解决方案1】:

    Invoke 采用Delegate,而不是类型化的Delegate,以使该方法尽可能通用。问题是 Delegate 类型是抽象类型,为了让编译器推断参数的数量和类型或 lambda 的返回类型,您必须提供“具体”Delegate 类型。一个常见的解决方案是将您的 lambda 封装在 Action 委托中,因为 Action 派生自 Delegate。事实上,您可以直接或间接地传递从 Delegate 继承的任何类型,包括您在项目中定义的自定义委托。

    试试这样的:

    base.Invoke(new Action(() => { prgWork.Value = 100; }));
    

    如果您发现自己经常使用Invoke,我建议您创建一个这样的扩展方法:

    public static void Invoke(this Control control, Action action)
    {
        control.Invoke(action);
    }
    

    或使用 C#6 语法

    public static void Invoke(this Control control, Action action) => control?.Invoke(action);
    

    现在你可以像这样使用它了:

    someControl.Invoke(() => { prgWork.Value = 100; });
    

    这里编译器会为你创建一个new Action 对象,清理你的代码。这也阐明了为什么您的尝试没有奏效。您基本上是在要求编译器创建抽象类 Delegate 的实例。

    【讨论】:

      【解决方案2】:

      试试这个:

      base.Invoke((Action)(() => { prgWork.Value = 100; }));
      

      【讨论】:

      • 这看起来更像是一条评论。请查看how to write an answer。添加更多详细信息以证明您的回答是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多