我遇到了一个我似乎无法弄清楚的问题,尽管StackOverflow上有一个标准问题。
base.Invoke(() => prgWork.Value = 100);
我做错了什么? 当我编译它时,我收到错误消息:
无法将lambda表达式转换为类型委托,因为委托不是类型
答案 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
的实例。