无法将lambda表达式转换为类型“System.Delegate”,因为它不是委托类型。

4
我将一个项目导入到Visual Studio中,想要查看源代码并尝试编译它,但是我在相同的CS文件中约20个不同位置都遇到了同样的错误。
以下是一个抛出错误的代码示例(错误在传递给this.Invoke的整个重载函数中)。
  if (this.InvokeRequired)
  {
    this.Invoke((Delegate) (() => this.CheckVersionInfo()));
  }

这里有很多关于此的信息:https://dev59.com/yHE95IYBdhLWcg3wUMHW - Anton
2个回答

4
你只能将 lambda 表达式转换为特定的委托类型。但在这种情况下,使用Action(或MethodInvoker、任何不带参数且具有void返回类型的委托类型)非常容易:
if (this.InvokeRequired)
{
  this.Invoke((Action) (() => this.CheckVersionInfo()));
}

或者只需使用方法组转换来简化操作:
if (this.InvokeRequired)
{
  this.Invoke((Action)CheckVersionInfo);
}

或者,将一个扩展方法添加到ControlISynchronizeInvoke中,仅仅是为了添加一个Invoke(Action)方法,或者是一个“检查和调用”方法。(在不同的上下文中,两者都可能有用。)

但老实说,如果你导入的代码基本上是这样的破烂,我会非常紧张。如果代码甚至无法编译,那么一旦你修复了最明显的错误,你对它能够正常工作有多少信心呢?

请注意,这不仅仅是C#的不同版本之类的问题 - 你发布的代码在任何版本的C#中都永远不会起作用。


你发布的代码在任何版本的C#中都不会起作用,我正想问你这个问题 :) - Alex Filipovici
谢谢您的回答,但是当我尝试时,它给了我这个错误:'使用通用类型'System.Action<T>'需要1个类型参数'。 - stingray-11
实际上,如果我将.NET版本更改为3.5,似乎可以解决这个问题。这个项目使用的是2.0版本。 - stingray-11
1
@user1653653:哦,你在使用.NET 2.0吗?(非泛型的Action类是在.NET 3.5中引入的。)在这种情况下,要么自己声明一个Action委托,要么使用MethodInvoker。将来,如果你使用的.NET版本距离当前版本有那么远,请在问题中指出 :) - Jon Skeet

0

试试这个:

this.Invoke(new MethodInvoker(() => this.CheckVersionInfo()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接