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

时间:2018-03-31 22:08:49

标签: c#

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

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

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

  

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

2 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分: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的实例。