5

次のオーバーロードを使用しInvokeて呼び出そうとしています:Dispatcher

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

名前付き引数を使用したいのですが、params 修飾子を使用した引数の構文が見つからないようです。次のすべてはコンパイルされません。

dispatcher.Invoke(method: () => { }, args: {});
dispatcher.Invoke(method: () => { }, args: new object[0]);
dispatcher.Invoke(method: () => { }, args: null);
dispatcher.Invoke(method: () => { }, args: new object[] {});
object[] foo = {};
dispatcher.Invoke(method: () => { }, args: foo);
dispatcher.Invoke(method: () => { }, args: new[] {"Hello", "World!"});

明確な答えがないように思われる次の 2 つの質問を見つけました。

パラメータ付きの名前付きパラメータ

string.Formatの名前付き引数を設定するには?

だから私の質問は、それができるかどうかです。はいの場合、どのように?

UDPATE

Daniel Hilgarth はparams、名前付きパラメーターで yes を使用できることを示しています。このパターンを使用して彼の答えを統合しました:

Action method = () => { };
if (_dispatcher != null)
    _dispatcher.Invoke(method: method, args: null);
else
    method();
4

2 に答える 2

2

次のコードは問題なくコンパイルされます。

void Main()
{
    Invoke(method: () => {}, args: new object[] {});
}

public object Invoke(Action method, params object[] args)
{
    return null;
}

に変換できないため、最初のパラメーターの型を から に変更しDelegateActionコンパイルする必要がありました。() => {}Delegate

または、以下もコンパイルされます。

void Main()
{
    Action method = () => {};
    Invoke(method: method, args: new object[] {});
}

public object Invoke(Delegate method, params object[] args)
{
    return null;
}

私の仮定では、argsパラメーターについてコンパイル エラーが発生したことはありませんが、 「'ラムダ式' から 'System.Delegate' に変換できませんmethod」というパラメーターについてです。この問題は、ラムダを Action ( ) にキャストするか、パラメーターとしてメソッドに渡されるタイプの変数を定義することによって解決されます (上記を参照)。これは、暗黙的に に変換できるためです。Invoke(method: (Action)(() => {}) ...ActionActionDelegate

于 2012-04-13T13:54:54.917 に答える
2

試してみてください。

dispatcher.Invoke(method: () => { }, args: new[] {"Hello", "World!"});
于 2012-04-13T13:49:27.713 に答える