解决C#中的params

时间:2013-06-17 20:46:31

标签: c# params

解析params传递的可变数量参数时有哪些规则?

假设我有代码:

public void Method(params object[] objects) { }

public void Method(IMyInterface intf, params object[] objects) { }

如果a是IMyInterface,Method(a, b, c)如何解决?我可以确定,C#总是会尝试选择最匹配的重载吗?

2 个答案:

答案 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[]);