无参数方法签名与参数委托不匹配

本文关键字:参数 不匹配 方法 | 更新日期: 2023-09-27 18:36:25

为什么不:

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

编译? 似乎应该匹配得很好。

无参数方法签名与参数委托不匹配

委托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();

params是一个纯粹的编译时功能。
委托绑定将忽略它。

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

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

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

§7.5.3.1 说:

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