是什么使方法的名称等同于动作委托?

Aar*_*ide 5 c# delegates

我只是在尝试并最终获得以下代码段:

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相同.

这是怎么回事?

Bol*_*ock 7

在C#中,委托只不过是方法指针.它们可以指向类中的现有方法,或者完全指向独立的匿名委托对象.

上面链接中的这一段应该解释代码中发生了什么:

可以将任何与委托签名匹配的方法(包括返回类型和参数)分配给委托.这使得可以以编程方式更改方法调用,并将新代码插入现有类中.只要您知道代理人的签名,就可以分配自己的委托方法.

也就是说,在解析委托类型时,所考虑的是他们的签名,而不是他们的名字.

在您的情况下,您的F1()F2()方法,不带参数并且不返回任何内容,与无参数Action委托具有匹配的签名:

public delegate void Action();
Run Code Online (Sandbox Code Playgroud)

因此,它们可以隐含地转换为Action.

如果您尝试传递具有不同返回类型或至少一个参数的方法,您将收到编译时错误,因为它不符合Action签名.

  • 并且,使用`F1`而不是`()=> F1()`直接调用方法而不是在它周围添加额外的委托. (2认同)

Kev*_*sco 3

基本上,这是后台发生的事情:

\n\n
void 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它们并不完全等同,但非常接近。它们将在运行时呈现相同的结果,唯一的区别是第一个 Sequence 调用中的参数将是一个 Action,它调用一个匿名方法,然后调用静态方法 F1 和 F2;第二个 Sequence 调用将是一个调用静态方法 F1 和 F2 的 Action。

\n\n

我希望这有帮助。

\n