3

我不能直接传递一个 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 应该是匿名代表的语法糖。那么这里的故事是什么?我错过了什么?

4

3 回答 3

5

Lambda 本身不是代表。但是,就像您引用的文本一样,它们可用于创建代表:

form.Invoke(new Action(() => AMethod(form)));
于 2012-10-18T14:11:03.853 回答
4

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

Invoke另一方面,它不采用某些特定的委托类型,它采用一个Delegate没有任何签名的实例。您需要将您的 lambda 包装在new SomeActualDelegateType(...)(Action是这里某些委托的常见选择,但不是唯一的选择) 以赋予它一个实际的签名。

于 2012-10-18T14:11:36.073 回答
0

尝试创建动作:form.Invoke(new Action(() => MyMethod(form)));

于 2012-10-18T14:13:32.583 回答