无参数方法签名与参数委托不匹配
本文关键字:参数 不匹配 方法 | 更新日期: 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 说:
对于包含参数数组的函数成员,如果函数成员适用上述规则,则称其正常形式适用。如果包含参数数组的函数成员在其正常形式中不适用,则该函数成员可能以其扩展形式适用: