【发布时间】:2018-04-12 00:52:07
【问题描述】:
我遇到了一个我似乎无法弄清楚的问题,尽管这是 StackOverflow 上的一个标准问题。
base.Invoke(() => prgWork.Value = 100);
我做错了什么? 当我编译它时,我收到错误消息:
无法将 lambda 表达式转换为类型委托,因为委托不是类型
【问题讨论】:
标签: c#
我遇到了一个我似乎无法弄清楚的问题,尽管这是 StackOverflow 上的一个标准问题。
base.Invoke(() => prgWork.Value = 100);
我做错了什么? 当我编译它时,我收到错误消息:
无法将 lambda 表达式转换为类型委托,因为委托不是类型
【问题讨论】:
标签: c#
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 的实例。
【讨论】:
试试这个:
base.Invoke((Action)(() => { prgWork.Value = 100; }));
【讨论】: