【发布时间】: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”,因为它不是委托类型
【问题讨论】:
谁能告诉我为什么这行代码不能编译?它会生成 CS1660:
s.run_button.Invoke((b) => { b.Enabled = false; },
new object[] { s.run_button });
Visual Studio 说:无法将 lambda 表达式转换为类型“System.Delegate”,因为它不是委托类型
【问题讨论】:
Lambda 表达式本身没有类型并且不能转换为System.Delegate。 Invoke 方法的类型为 System.Delegate,因此它不会编译,因为 lambda 表达式没有类型。您需要在此处提供显式类型转换
s.run_button.Invoke(
(Action<Button>)((b) => { b.Enabled = false; }),
new object[] { s.run_button });
【讨论】:
Invoke 方法采用 Delegate 类型的参数。它是在 lambda 进入我们的世界之前编写的。对您来说最简单的解决方案是用 Action 包装您的 lambda。我不确定“b”究竟是什么类型(C# 编译器也没有,因此会出现错误),因此您必须显式传递它。比如:
s.run_button.Invoke(new Action<Button>(b => b.Enabled = false), new object[] { s.run_button });
【讨论】: