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