我只是在尝试并最终获得以下代码段:
public static class Flow {
public static void Sequence(params Action[] steps) {
foreach (var step in steps)
step();
}
}
void Main() {
Flow.Sequence(() => F1(), () => F2());
Flow.Sequence(F1, F2); // <-- what makes this equiv to the line above?
}
void F1() { }
void F2() { }
Run Code Online (Sandbox Code Playgroud)
我没有意识到单独的方法名称与Action相同.
这是怎么回事?
在C#中,委托只不过是方法指针.它们可以指向类中的现有方法,或者完全指向独立的匿名委托对象.
上面链接中的这一段应该解释代码中发生了什么:
可以将任何与委托签名匹配的方法(包括返回类型和参数)分配给委托.这使得可以以编程方式更改方法调用,并将新代码插入现有类中.只要您知道代理人的签名,就可以分配自己的委托方法.
也就是说,在解析委托类型时,所考虑的是他们的签名,而不是他们的名字.
在您的情况下,您的F1()和F2()方法,不带参数并且不返回任何内容,与无参数Action委托具有匹配的签名:
public delegate void Action();
Run Code Online (Sandbox Code Playgroud)
因此,它们可以隐含地转换为Action.
如果您尝试传递具有不同返回类型或至少一个参数的方法,您将收到编译时错误,因为它不符合Action签名.
基本上,这是后台发生的事情:
\n\nvoid Main() \n{\xc2\xa0 \xc2\xa0 \n Flow.Sequence(new Action(delegate(){ F1(); }), new Action(delegate(){ F2(); }));\xc2\xa0 \xc2\xa0 \n Flow.Sequence(new Action(F1), new Action(F2)); \n}\nRun Code Online (Sandbox Code Playgroud)\n\n它们并不完全等同,但非常接近。它们将在运行时呈现相同的结果,唯一的区别是第一个 Sequence 调用中的参数将是一个 Action,它调用一个匿名方法,然后调用静态方法 F1 和 F2;第二个 Sequence 调用将是一个调用静态方法 F1 和 F2 的 Action。
\n\n我希望这有帮助。
\n