假设我创建了这两种方法:
public void AddScriptToPage(params string[] scripts) { /*...*/ }
public void AddScriptToPage(string href, string elementId) { /*...*/ }
以下代码调用了哪一种方法?为什么?
AddScriptToPage("dork.js", "foobar.js");
编译器如何确定调用哪种方法?
答案 0 :(得分:8)
调用第二个方法,如果找到完全匹配,则在params之前使用它。
执行重载决策时,带参数数组的方法可以采用其正常形式或扩展形式(第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[]);
答案 1 :(得分:5)
public void AddScriptToPage(string href, string elementId)
..将被调用。编译器选择具有最准确匹配的签名,其中params具有最低优先级。