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