3

MyMethodDelegateこのようなシナリオで明示的に宣言することを避ける方法はありますか?

bool MyMethod(string x)
{
    //...
}

BeginInvoke(new MyMethodDelegate(MyMethod), x);

ラムダ a-la については知ってい()=>MyMethod(x)ますが、編集と継続が中断されるため、時々それらを避けたいと思います。

編集:うまくいきBeginInvoke(MyMethod, x)ません:

The best overloaded method match for 'System.Windows.Forms.Control.BeginInvoke(System.Delegate, params object[])' has some invalid arguments
Argument 1: cannot convert from 'method group' to 'System.Delegate'
Argument 2: cannot convert from 'string' to 'object[]'

BeginInvoke は次のように定義されます。

public IAsyncResult BeginInvoke(Delegate method, params object[] args);

特定のデリゲート型が指定されていないため、コンパイラはどのデリゲート型からインスタンス化するかを検出できません。BeginInvoke(MyMethod. x)

4

2 に答える 2

5

フレームワーク>=3.5の場合、事前定義されたデリゲートAction<>およびFunc<>を使用できます(あなたの場合)

    BeginInvoke(new Func<int, bool>(MyMethod), x);

Funcのドキュメント http://msdn.microsoft.com/ru-ru/library/bb549151.aspx

于 2012-12-07T10:27:26.860 に答える
3

多くの場合、簡易版を使用できます

MyMethod

代理人が必要な場合。キーワードはしばしばです。

ただし、メソッド グループを変換するデリゲートの型をコンパイラが判断できない場合は、明示的な変換を行う必要があります。

ラムダは、まだ定義しておらず、コード内の他の場所で必要のない関数を渡したい場合に便利です。次に、必要な場所で関数を簡単に定義できるため、ラムダ (および一般的な無名関数) は非常に便利です。

BeginInvoke の場合、キャストまたは代入のいずれかによって、メソッド グループを明示的にデリゲートに変換する必要があるというコメントに記載されているように、あなたは正しいです。

Func<int,bool) m = MyMethod;
BeginInvoke(m,x);
BeginInvoke((Func<inte,bool>)MyMethod,x);

Func として解釈されるため、コンパイルするか、ラムダを渡すことができます

BeginInvoke(a=>MyMethod(a),x);
于 2012-12-07T09:58:31.610 に答える