Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:方法签名?_C#_Method Signature - Fatal编程技术网

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-你从未停止过一个我从未想到过的深刻的框架问题/事实让我惊讶……但几个月后,你最终在实践中使用了它。你在这里的一些回答给我带来了巨大的性能差异,请继续关注;这是一座金矿。