【发布时间】:2012-10-18 14:07:18
【问题描述】:
我不能直接传递一个 lambda
form.Invoke(() => AMethod(form));
因为奇怪的是 lambda 不是委托类型(根据编译器错误)。我似乎记得 Jon Skeet 的 .NET 4.0 书中的不同信息。在MSDN 上它说:
lambda 表达式是一个匿名函数,您可以使用它 创建委托或表达式树类型
public static void Main()
{
Form form = new Form();
form.Show();
form.Invoke(() => AMethod(form));
Application.Run();
Console.Read();
}
public static void AMethod(Form form)
{
form.SendToBack();
}
}
然而,这里我们收到一个编译器错误:
无法将 lambda 表达式转换为类型“System.Delegate”,因为它 不是委托类型。
Lambda 应该是匿名代表的语法糖。那么这里的故事是什么?我错过了什么?
【问题讨论】:
-
顺便说一句,除了下面的答案之外,请随意创建一个扩展方法,该方法采用
Action委托类型,该委托类型反过来包装Form.Invoke方法。这样你就可以拥有上面的语法,而不必每次都显式地转换/构造一个Action。 -
我相信我也错过了一个微妙之处。委托关键字和委托类型之间存在区别。
-
delegate关键字定义了一个新的MulticastDelegate子类类型。例如:Action : MulticastDelegate : Delegate : Object。Delegate大写作为System.Delegate类型存在。只是为了让事情变得有趣,我们经常交换delegate(关键字)、Delegate(类型)和“代表”(概念):) 虽然通常,如果你看到Delegate大写,它是指System.Delegate输入但并非总是如此。
标签: c#