为什么不:
delegate void MyDelegate(params object[] parameters);
static void ShouldMatch() {}
MyDelegate compilerError = ShouldMatch;
编译?好像它应该匹配得很好。
答案 0 :(得分: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();
答案 1 :(得分:0)
params
是纯粹的编译时功能
委托绑定忽略它。
您的代理人必须完全匹配方法的参数,忽略params
&可选参数。
规范在§6.6中明确说明了这一点:
o所考虑的候选方法只是那些适用于其正常形式的方法(第7.5.3.1节),而不仅仅是那些仅适用于其扩展形式的方法。
§7.5.3.1说:
对于包含参数数组的函数成员,如果函数成员适用于上述规则,则称其适用于其正常形式。如果包含参数数组的函数成员不适用于其正常形式,则函数成员可能适用于其扩展形式: