为什么不:
delegate void MyDelegate(params object[] parameters);
static void ShouldMatch() {}
MyDelegate compilerError = ShouldMatch;
编译?看起来它应该匹配得很好。
为什么不:
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 说:
对于包含参数数组的函数成员,如果该函数成员按上述规则适用,则称其正常形式适用。如果包含参数数组的函数成员不适用于其正常形式,则该函数成员可以改为以其扩展形式适用: