C#:方法签名?

标签 c# method-signature

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

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

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

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

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

最佳答案

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

From 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[]);

关于C#:方法签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2168041/

相关文章:

python - 基方法和子方法签名中的参数数量不一致

php - 这个签名在 PHP 中是什么意思 (&)?

c# - 任务如何知道它何时完成?

c# - Entity Framework 和函数导入的错误消息

java - 即使方法使用更通用的类型,方法调用也不匹配方法签名

java - 如何从 jar 文件中获取方法签名?

c - C 中的方法签名,在静态数组上传递指针

C# - 转换为基本类型如何工作?

c# - 如何创建包含所有其他内容的 dll?

c# - 如何重新启动单个实例 winforms 应用程序