3

ラムダを直接渡すことはできません

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

奇妙なことに、ラムダはデリゲート型ではないためです(コンパイラエラーによる)。JonSkeetの.NET4.0の本でさまざまな情報を思い出しているようです。そしてMSDNでそれは言う:

ラムダ式は、デリゲートまたは式ツリータイプ 作成するために使用できる無名関数です

    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();
    }
}

しかし、ここでコンパイラエラーが発生します。

デリゲート型ではないため、ラムダ式を型'System.Delegate'に変換できません。

Lambdaは、匿名のデリゲートの構文糖衣であると想定されています。それで、ここでの話は何ですか?私は何を逃しましたか?

4

3 に答える 3

5

ラムダ自身は代表者ではありません。ただし、引用テキストと同様に、デリゲートを作成するために使用できます。

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

はい、ラムダはデリゲートを作成するために使用されますが、それ自体はデリゲートではありません。ここでの主な問題は、ラムダに署名がなく、パラメータリストとリターンタイプが配置されたコンテキストに基づいて決定されることです。特定の定義されたデリゲートインスタンスが期待される場所にラムダを配置すると、コンパイラは何を認識しますかラムダが有効であるためには、署名が一致する必要があります。

Invoke一方、特定のデリゲートタイプはDelegate使用せず、署名のないインスタンスを使用します。ラムダをラップしてnew SomeActualDelegateType(...)Actionここでは一部のデリゲートにとって一般的な選択ですが、唯一の選択ではありません)、実際の署名を与える必要があります。

于 2012-10-18T14:11:36.073 に答える
0

アクションを作成してみてください:form.Invoke(new Action(() => MyMethod(form)));

于 2012-10-18T14:13:32.583 に答える