我有两种方法如下
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
答案 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