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

13

我在使用C#中的匿名委托Lambda时遇到了问题。我把程序转换为C#5后,委托出现了问题。非常感谢能提供帮助。具体错误信息如下:

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

public void UpdateUserList()
{
  if (!Monitor.TryEnter((object)this.LvPerson, 150))
      return;

  if (this.InvokeRequired)
  {
      this.Invoke((Delegate) (() => this.UpdateUserList()));              
  }
  else
  { ... }
}

我也尝试过

this.Invoke(() => {this.UpdateUserList();});

我无法确定问题出在哪里,因为在将项目从Visual Studio 2008移动到Visual Studio 2015之前,它是可以工作的。

再次感谢您的帮助!


this 指的是什么?Invoke() 的方法签名是什么? - sara
这真的可行吗?据我所知,Lambda表达式无法转换为委托。从来没有过。 - usr
1
可能是重复的问题:无法将 lambda 表达式转换为类型 'System.Delegate' - Alex Essilfie
1个回答

21

Invoke方法需要一个Delegate类型的实例,因为您使用了lambda表达式,它不能自动将表达式转换成像new Delegate()这样的东西,因为Delegate没有公共构造函数。使用

this.Invoke(new Action(() => {this.UpdateUserList();}));

由于Action是Delegate的子类,所以可以解决问题。为了避免在使用Invoke时重复编写new Action(...),可以编写一组扩展方法,将Action作为参数传递,这样C#编译器就会处理new Action(...),从而使你的代码更加简洁。

如果你正在使用Invoke进行一些可能涉及其他线程的异步操作,请查看任务并行库(TPL)和基于任务的异步模式(TAP),后者在C#和Visual Basic.NET中内置支持,使用await将不再需要调用Invoke(),并且允许你在后台运行一些操作,从而释放你的UI。


这个可行。将其作为扩展放置是个好主意。我甚至可能会将其构建到我已经设置好的一些库中。自2011年以来,我还没有更新过这段代码。 - Jason Coffman

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