为什么c#委托调用接受函数名作为参数?

为什么c#委托调用接受函数名作为参数?,c#,C#,我试着去理解代表们。当我运行以下代码时: public delegate void DelegateType1(); public static void callDelegate1(DelegateType1 callback) { callback(); } void start() { callDelegate1(runMe); } void runMe() { Debug.Log("Why?"); } 它输出“为什么?” 我的问题是:如果CallDeleg

我试着去理解代表们。当我运行以下代码时:

public delegate void DelegateType1();

public static void callDelegate1(DelegateType1 callback) {
    callback();
}

void start() {
    callDelegate1(runMe);
}

void runMe() {
    Debug.Log("Why?");
}
它输出“为什么?”

我的问题是:如果CallDelegate1接受DelegateType1类型的参数,为什么它也接受函数名作为参数?还有,这是一种不好的做法吗?我在网上看到的每个教程都将函数名存储在DelegateType1类型的变量中。

解释如下:

我的问题是:如果
f
接受类型为
long
的参数,为什么它也接受
int
作为参数

因为存在从
int
long
的隐式转换

我的问题是:如果CallDelegate1接受DelegateType1类型的参数,为什么它也接受函数名作为参数

因为存在从方法组到委托类型的隐式转换

还有,这是一种不好的做法吗?我在网上看到的每个教程都将函数名存储在DelegateType1类型的变量中

最明确的形式是

void start() {
    DelegateType1 runMeDelegate = new DelegateType1(runMe);
    callDelegate1(runMeDelegate);
}
通过将其作为转换写入,可以使其不那么明确:

void start() {
    DelegateType1 runMeDelegate = (DelegateType1) runMe;
    callDelegate1(runMeDelegate);
}
通过使转换隐式,可以使其更不显式:

void start() {
    DelegateType1 runMeDelegate = runMe;
    callDelegate1(runMeDelegate);
}
最后,您可以完全删除该变量:

void start() {
    callDelegate1(runMe);
}
他们都很好,都做同样的事情。第一种形式是代码生成器通常使用的形式,因为委托类型的显式构造在不同语言中得到最广泛的支持。最后一种形式是程序员在有足够C#经验的人清楚地知道那里发生了什么时倾向于编写的

教程的重点不是有足够C#经验的程序员,因此为了更清楚地说明发生了什么,他们可能会选择使用一种更详细的形式。如果有助于理解的话,坚持使用该表格没有什么错,但使用较短的表格也同样没有错。

意译:

我的问题是:如果
f
接受类型为
long
的参数,为什么它也接受
int
作为参数

因为存在从
int
long
的隐式转换

我的问题是:如果CallDelegate1接受DelegateType1类型的参数,为什么它也接受函数名作为参数

因为存在从方法组到委托类型的隐式转换

还有,这是一种不好的做法吗?我在网上看到的每个教程都将函数名存储在DelegateType1类型的变量中

最明确的形式是

void start() {
    DelegateType1 runMeDelegate = new DelegateType1(runMe);
    callDelegate1(runMeDelegate);
}
通过将其作为转换写入,可以使其不那么明确:

void start() {
    DelegateType1 runMeDelegate = (DelegateType1) runMe;
    callDelegate1(runMeDelegate);
}
通过使转换隐式,可以使其更不显式:

void start() {
    DelegateType1 runMeDelegate = runMe;
    callDelegate1(runMeDelegate);
}
最后,您可以完全删除该变量:

void start() {
    callDelegate1(runMe);
}
他们都很好,都做同样的事情。第一种形式是代码生成器通常使用的形式,因为委托类型的显式构造在不同语言中得到最广泛的支持。最后一种形式是程序员在有足够C#经验的人清楚地知道那里发生了什么时倾向于编写的


教程的重点不是有足够C#经验的程序员,因此为了更清楚地说明发生了什么,他们可能会选择使用一种更详细的形式。如果有助于理解的话,坚持使用该形式没有错,但使用较短的形式也没有错。

我认为这个问题类似于问为什么可以调用一个声明为
f(int I)
的函数,参数为
1
int
变量表示对int值的引用;“代表”。函数名是委托文本,如
1
是int-literalexactly@PeterA.SchneiderC#规范:6.6方法组转换从方法组(§7.1)到兼容委托类型的隐式转换(§6.1)。我认为这个问题类似于问为什么可以调用声明的函数
f(int-I)
参数为
1
int
变量表示对int值的引用;“代表”。函数名是委托文字,如
1
是int-literalexactly@PeterA.SchneiderC#规范:6.6方法组转换存在从方法组(§7.1)到兼容委托类型的隐式转换(§6.1)。