C#:方法签名?
假设我创建了这两种方法:C#:方法签名?,c#,method-signature,C#,Method Signature,假设我创建了这两种方法: public void AddScriptToPage(params string[] scripts) { /*...*/ } public void AddScriptToPage(string href, string elementId) { /*...*/ } 下面的代码调用这些方法中的哪一个,为什么 AddScriptToPage("dork.js", "foobar.js"); 编译器如何确定调用哪个方法 public void AddScriptTo
public void AddScriptToPage(params string[] scripts) { /*...*/ }
public void AddScriptToPage(string href, string elementId) { /*...*/ }
下面的代码调用这些方法中的哪一个,为什么
AddScriptToPage("dork.js", "foobar.js");
编译器如何确定调用哪个方法
public void AddScriptToPage(string href, string elementId)
。。我会接到电话的。编译器选择匹配最精确的签名,参数的优先级最低。将调用第二个方法,如果找到精确匹配,则在参数之前使用该方法 : 当执行重载解析时,带有参数数组的方法可能以其标准形式或扩展形式适用(第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[]);
当人们调用F(null)时,这尤其令人困惑。您得到F((对象[])null)还是F(新对象[]{null})?许多人期望后者,但由于前者在正常形式下适用,因此它更好。@Eric-你从未停止过一个我从未想到过的深刻的框架问题/事实让我惊讶……但几个月后,你最终在实践中使用了它。你在这里的一些回答给我带来了巨大的性能差异,请继续关注;这是一座金矿。