解析params
传递的可变数量参数时有哪些规则?
假设我有代码:
public void Method(params object[] objects) { }
public void Method(IMyInterface intf, params object[] objects) { }
如果a是IMyInterface,Method(a, b, c)
如何解决?我可以确定,C#总是会尝试选择最匹配的重载吗?
答案 0 :(得分:11)
这可以通过C#语言规范来解答:
7.5.3.1适用的功能成员
[...]
否则,如果MP适用于其正常形式且MQ具有 params数组,仅适用于其扩展形式,然后是MP 比MQ更好。
否则,如果MP的声明参数多于MQ,则MP为 比MQ更好。如果两个方法都有
params
个数组,则会发生这种情况 并且仅适用于其扩展形式。[...]
在您的示例中,两个重载仅适用于其扩展形式。由于第二个具有更多声明的参数,因此更好。
在规范的上下文中,一个重载更好比所有其他重载意味着编译器选择它来绑定调用,就像在讨论的例子中发生的那样(如果没有一个重载是比其他所有更好,结果是由于模糊而导致的编译时错误。
答案 1 :(得分:3)
另见C# Spec. 17.5.1.4 regarding Parameter arrays
执行重载解析时,带参数数组的方法 可以以其正常形式或以其扩展形式适用 (§14.4.2.1)。 2方法的扩展形式仅在以下情况下可用 该方法的正常形式不适用且仅适用于具有的方法 与扩展表单相同的签名尚未在声明中声明 同类型。
示例强>
using System;
class Test
{
static void F(params object[] a) {
Console.WriteLine("F(object[])");
}
static void F() {
Console.WriteLine("F()");
}
static void F(object a0, object a1) {
Console.WriteLine("F(object,object)");
}
static void Main() {
F();
F(1);
F(1, 2);
F(1, 2, 3);
F(1, 2, 3, 4);
}
}
产生输出:
F();
F(object[]);
F(object,object);
F(object[]);
F(object[]);