C# lambda表达式是委托吗?

C# lambda表达式是委托吗?,c#,C#,我不能直接通过lambda form.Invoke(() => AMethod(form)); 因为很奇怪,lambda不是委托类型(根据编译器错误)。我似乎回忆起Jon Skeet的.NET4.0书中的不同信息。上面写着: lambda表达式是一个匿名函数,您可以使用它来 创建委托或表达式树类型 然而,这里我们收到一个编译器错误: 无法将lambda表达式转换为类型“System.Delegate”,因为它 不是委托类型 Lambda应该是匿名代理的语法糖。那么这里的故事是什么?我错过

我不能直接通过lambda

form.Invoke(() => AMethod(form));
因为很奇怪,lambda不是委托类型(根据编译器错误)。我似乎回忆起Jon Skeet的.NET4.0书中的不同信息。上面写着:

lambda表达式是一个匿名函数,您可以使用它来 创建委托或表达式树类型

然而,这里我们收到一个编译器错误:

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


Lambda应该是匿名代理的语法糖。那么这里的故事是什么?我错过了什么?

拉姆达本身不是代表。但是,与引用的文本一样,它们也可用于创建代理:

form.Invoke(new Action(() => AMethod(form)));

是的,lambda用于创建代理,但它们本身不是代理。这里的主要问题是lambda没有签名,它们的参数列表和返回类型是根据它们所在的上下文确定的。当您将lambda放置在特定定义的委托实例预期的位置时,编译器知道lambda必须匹配哪个签名才能有效


另一方面,
Invoke
不采用特定的委托类型,它采用了一个没有任何签名的
delegate
实例。您需要将lambda包装在
newsomeactualdelegateType(…)
Action
是此处某些代理的常见选择,但不是唯一选择)中,以便为其提供实际签名。

尝试创建操作:
form.Invoke(新操作(()=>MyMethod(form))

顺便说一句,除了下面的答案之外,您还可以创建一个扩展方法,该方法采用
操作
委托类型,该委托类型反过来包装
表单。调用
方法。这样,您就可以拥有上面的语法,而不必每次都显式地强制转换/构造
操作。委托关键字和委托类型之间存在差异。
delegate
关键字定义了一个新的
多播委托
子类类型。例如:
Action:multicastdegate:Delegate:Object
<代码>委托
大写字母作为类型
系统存在。委托
。不过,为了让事情变得有趣,我们经常交换
delegate
(关键字)、
delegate
(类型)和“delegate”(概念):)虽然通常,如果您看到
delegate
大写,它是指
系统。delegate
类型,但并不总是这样。
form.Invoke(new Action(() => AMethod(form)));