带有嵌套Action问题的.NET Action

时间:2012-07-18 12:22:12

标签: .net lambda

我有下一个片段:

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

你能解释一下为什么这项工作?我看到Action<Action<bool>>需要使用只有Action<bool>参数的一些void方法。那么这里有两个第一个参数有什么问题?

我也不清楚为什么我们将m传递进去。如何在boolAction(true)中调用此lambda。那会发生什么?

对此的任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:1)

没有理由不应该工作。在创建lambda的行中,C#会自动从GetAction返回值的类型推断出lambda将接收哪些参数。要理解这段代码,重要的是要看到你没有返回m,但是你要返回

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

因此,m的类型为Action<bool>,上面的表达式为Action<Action<bool>>,其中内部Action实际为m

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

创建lambda表达式,该表达式对应于此签名的方法:

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

从这一部分我们看到mAction<bool>_no_nameAction<Action<bool>>

最后,您可能会以某种方式使用此代码:

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

实际上,我们的消息框调用委托成为m参数。