5

假设我创建了这两种方法:

public void AddScriptToPage(params string[] scripts) { /*...*/ }
public void AddScriptToPage(string href, string elementId) { /*...*/ }

下面的代码调用了这些方法中的哪一个,为什么?

AddScriptToPage("dork.js", "foobar.js");

编译器如何确定调用哪个方法?

4

2 回答 2

8

你的第二个方法被调用,如果找到完全匹配,它在参数之前使用。

来自 MSDN

在执行重载决议时,具有参数数组的方法可以以其正常形式或扩展形式适用(第 7.4.2.1 节)。仅当方法的正常形式不适用并且仅当具有与扩展形式相同签名的方法尚未在相同类型中声明时,方法的扩展形式才可用。

他们的例子:

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[]);
于 2010-01-30T13:47:13.677 回答
5
public void AddScriptToPage(string href, string elementId) 

..会被调用。编译器选择匹配最准确的签名,参数的优先级最低。

于 2010-01-30T13:45:44.647 回答