9

解析传递的可变数量参数时的规则是什么params什么?

假设我有代码:

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

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

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

4

2 回答 2

11

C#语言规范回答了这个问题:

7.5.3.1 适用函数成员

[...]

  • 否则,如果 MP 以其正常形式适用,而 MQ 有一个 params 数组且仅适用于其扩展形式,则 MP 优于 MQ。

  • 否则,如果 MP 的声明参数比 MQ 多,则 MP 优于 MQ。如果这两种方法都有params数组并且仅适用于它们的扩展形式,则可能会发生这种情况。

[...]

在您的示例中,两个重载都仅适用于它们的扩展形式。由于第二个有更多声明的参数,它会更好

在规范的上下文中,一个重载优于所有其他重载意味着编译器选择它来绑定调用,正如正在讨论的示例中所发生的那样(如果没有一个重载优于所有其他重载,则结果是由于歧义导致的编译时错误)。

于 2013-06-17T20:53:06.750 回答
3

另请参阅C# 规范。17.5.1.4 关于参数数组

在执行重载决议时,具有参数数组的方法可以以其正常形式或扩展形式(第 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[]);  
于 2013-06-17T20:54:48.280 回答