ラムダ式をプレーンなデリゲートパラメータとして提供する場合、なぜキャストする必要があるのか​​ 質問する

ラムダ式をプレーンなデリゲートパラメータとして提供する場合、なぜキャストする必要があるのか​​ 質問する

System.Windows.Forms.Control.Invoke(Delegateメソッド)メソッドを使用します。

なぜコンパイル時エラーが発生するのでしょうか:

string str = "woop";
Invoke(() => this.Text = str);
// Error: Cannot convert lambda expression to type 'System.Delegate'
// because it is not a delegate type

しかし、これは問題なく動作します:

string str = "woop";
Invoke((Action)(() => this.Text = str));

メソッドが単純なデリゲートを期待するのはいつですか?

ベストアンサー1

ラムダ式はデリゲート型または式ツリーに変換できますが、どれのデリゲート型。シグネチャを知っているだけでは十分ではありません。たとえば、次のようなものがあるとします。

public delegate void Action1();
public delegate void Action2();

...

Delegate x = () => Console.WriteLine("hi");

参照されるオブジェクトの具体的な型はどうxなると思いますか?はい、コンパイラはできた適切なシグネチャを持つ新しいデリゲート型を生成しますが、これはほとんど役に立たず、エラー チェックの機会が少なくなってしまいます。

Control.Invoke簡単に呼び出したい場合、Action最も簡単な方法は、Control に拡張メソッドを追加することです。

public static void Invoke(this Control control, Action action)
{
    control.Invoke((Delegate) action);
}

おすすめ記事