0

次のスニペットがあります:

public Action<Action<bool>> GetAction()
{
    return m => MyMethod(123, "string", m);
}

private void MyMethod(int someInteger, string someString, Action<bool> boolAction)
{
    // some work with int and string was done
    boolAction(true);
}

なぜこれが機能するのか説明していただけますか?のパラメーターが1 つだけAction<Action<bool>>の void メソッドが必要であることがわかります。では、最初の引数が 2 つの場合、何が問題なのですか?Action<bool>

また、なぜ私たちがパスするのかは私には明らかではありませんm。でこのラムダを呼び出す方法boolAction(true)。そこで何が起こるでしょうか?

これに関するアドバイスは役に立ちます。

4

1 に答える 1

1

それが機能しないはずの理由はありません。GetActionラムダが作成された行で、C#は、戻り値のタイプから、ラムダが受け取るパラメーターを自動的に推測します。このコードを理解するには、戻ってこないことを確認することが重要ですが、戻ってきてmいます

m => MyMethod(123, "string", m);

したがって、mはタイプAction<bool>であり、上記の式はタイプAction<Action<bool>>であり、内部アクションは実際にはmです。

つまり

m => MyMethod(123, "string", m);

このシグネチャのメソッドに対応するラムダ式を作成します。

void _no_name(Action<bool> m) {
  MyMethod(123, "string", <delegate_to_no_name>);
}

mこの部分から、それが、、Action<bool>_no_nameあることがわかりますAction<Action<bool>>

最終的には、おそらく次のようにこのコードを使用します。

Action<Action<bool>> action = GetAction();
action(x => MessageBox.Show("X of type bool is " + x.ToString()));

事実上、メッセージボックスの呼び出しデリゲートがmパラメータになります。

于 2012-07-18T12:46:12.320 に答える