我有下一个片段:
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。那会发生什么?
对此的任何建议都会有所帮助。
答案 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>);
}
从这一部分我们看到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
参数。