C#用params修饰符重载方法

时间:2017-02-26 16:30:36

标签: c# parameters mono overloading

我有两种方法如下

int foo (int a, param int[] b);  // f1
int foo (params int[] a);        // f2

以扩展形式,如何拨打f1

信息

当我使用扩展表单 foo (1, 2)时,会调用f2。我需要明确使用普通表单 foo (1, new [] {2})来调用f1

我正在使用Mono C# compiler version 4.6.2.0 - https://repl.it/Fy4L

2 个答案:

答案 0 :(得分:1)

阅读在https://www.microsoft.com/en-us/download/confirmation.aspx?id=7029找到的C#5的语言规范,我们发现以下内容:

  

"如果MP的声明参数多于MQ,则MP优于   MQ。如果两个方法都有params数组,则会发生这种情况   仅适用于其扩展形式"

- 第7.5.3.2节

MQ和MP指的是重载决策中的候选方法。扩展形式是指将params数组扩展为一系列参数(即当使用params部分时)。

这意味着在这个版本的规范中,如果你有更多的声明参数(f1这样做),那么它将是更好的候选者。

从内存来看,虽然我没有检查规范的所有版本,但总是如此。在任何时候改变这种行为都是一个突破性的变化,我将99.99%确定编译器团队不会做的事情(感谢@xanatos在评论中指出这一点)。我相信答案就是在你的代码中应该选择f1作为正确的重载,单声道中的错误会导致你看到的行为。

这似乎得到了@xanatos找到的https://bugzilla.xamarin.com/show_bug.cgi?id=6541的支持(再次感谢)。错误示例代码使用字符串,但问题相同。

答案 1 :(得分:0)

int f(int i, params int[] a) { return 1; }  // 1
int f(       params int[] a) { return 2; }  // 2

然后你可以做几个测试:

Debug.Print("" + f(1)               );      // 1
Debug.Print("" + f(1, 2)            );      // 1 (2 in Mono?)
Debug.Print("" + f(1, new int[] { }));      // 1

Debug.Print("" + f()                    );  // 2
Debug.Print("" + f(new int[] { } )      );  // 2
Debug.Print("" + f(new int[] { 1, 2 })  );  // 2