【问题标题】:cross thread invoke compilation problem跨线程调用编译问题
【发布时间】:2010-07-30 00:33:30
【问题描述】:

谁能告诉我为什么这行代码不能编译?它会生成 CS1660:

s.run_button.Invoke((b) => { b.Enabled = false; },
 new object[] { s.run_button });

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

【问题讨论】:

    标签: c# lambda invoke


    【解决方案1】:

    Lambda 表达式本身没有类型并且不能转换为System.DelegateInvoke 方法的类型为 System.Delegate,因此它不会编译,因为 lambda 表达式没有类型。您需要在此处提供显式类型转换

    s.run_button.Invoke(
      (Action<Button>)((b) => { b.Enabled = false; }), 
      new object[] { s.run_button });
    

    【讨论】:

      【解决方案2】:

      Invoke 方法采用 Delegate 类型的参数。它是在 lambda 进入我们的世界之前编写的。对您来说最简单的解决方案是用 Action 包装您的 lambda。我不确定“b”究竟是什么类型(C# 编译器也没有,因此会出现错误),因此您必须显式传递它。比如:

      s.run_button.Invoke(new Action<Button>(b => b.Enabled = false), new object[] { s.run_button });
      

      【讨论】:

      • 谢谢,正是我需要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多