1

为什么不:

delegate void MyDelegate(params object[] parameters);
static void ShouldMatch() {}
MyDelegate compilerError = ShouldMatch;

编译?看起来它应该匹配得很好。

4

2 回答 2

1

委托MyDelegate定义了一个采用对象数组的方法,但您的ShouldMatch方法没有。假设您尝试将任何参数传递给您的委托实例,如下所示:

compilerError(someObject, someOtherObject);

如果该方法compilerError被绑定为不接受任何参数,那么您希望在这里发生什么?

尝试以与委托签名匹配的方式定义您的方法:

delegate void MyDelegate(params object[] parameters);
static void ShouldMatch(params object[] parameters) {}

MyDelegate noCompilerError = ShouldMatch;

或者您可以尝试将其包装在 lambda 表达式中,如下所示:

delegate void MyDelegate(params object[] parameters);
static void ShouldMatch() {}

MyDelegate noCompilerError = (paramArray) => ShouldMatch();
于 2013-10-23T00:44:28.037 回答
0

params是一个纯粹的编译时特性。
委托绑定会忽略它。

您的委托必须完全匹配方法的参数,忽略params和可选参数。

规范在 §6.6 中明确说明了这一点:

o 考虑的候选方法仅是适用于其正常形式(第 7.5.3.1 节)的那些方法,而不是仅适用于其扩展形式的那些方法。

§7.5.3.1 说:

对于包含参数数组的函数成员,如果该函数成员按上述规则适用,则称其正常形式适用。如果包含参数数组的函数成员不适用于其正常形式,则该函数成员可以改为以其扩展形式适用:

于 2013-10-23T00:42:18.730 回答