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

时间:2015-08-08 22:07:43

标签: c# lambda delegates

我在C#中使用匿名委托lambda时遇到问题。我刚刚将应用程序转换为C#5,代表们对我一切都失控了。任何帮助都会很棒。具体错误是:

  

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

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之前,我不知道问题出在哪里,因为这是有效的。

再次感谢您的帮助!

1 个答案:

答案 0 :(得分:14)

Invoke方法需要一个Delegate类型实例,因为你使用lambda表达式,它不能自动将表达式转换为类似新的Delegate(),因为Delegate没有公共构造函数。使用

(function(){
'use strict';

angular.module('app')
.controller('ConfigCtrl', ConfigCtrl);

function ConfigCtrl(Customization){
    var vm = this;

    vm.attribute = Customization.getAttribute(); // bind
    vm.attributes = [];

    // Functions
    vm.setAttribute = Customization.setAttribute;

    init();
    /////
    function init(){
        // Get attributes array
        vm.attributes = Customization.getAttributes();
    }
}})();

应该解决问题,因为Action是Delegate的子类。要在使用Invoke时摆脱冗余的新Action(...),你可以编写一组扩展方法,将Action作为参数,这样新的Action(...)将由C#编译器处理,所以你每次使代码更清洁时,都不必写它。

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