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

你能解释一下为什么会这样吗?我看到Action<Action<bool>>需要一些只有一个参数的void 方法Action<bool>。那么这两个第一个论点有什么问题呢?

我也不清楚我们为什么要m进入。如何在boolAction(true). 那里会发生什么?

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

4

1 回答 1

1

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

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

因此,mis 是 type Action<bool>,上面的表达式是 type Action<Action<bool>>,其中内部 Action 实际上是m

IE

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参数。

于 2012-07-18T12:46:12.320 回答