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

时间:2013-10-23 00:38:23

标签: c# delegates compiler-errors params

为什么不:

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

编译?好像它应该匹配得很好。

2 个答案:

答案 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说:

  

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