C#: Сигнатуры методов?

Скажем, я создаю эти два метода:

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

Какой из этих методов получает вызов кодом ниже, и почему?

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

Как компилятор определяет который метод звонить?

5
задан Deduplicator 19 October 2015 в 21:56
поделиться

2 ответа

Ваш второй метод вызывается, если найдено точное совпадение, он используется перед параметрами.

Из 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[]);
8
ответ дан 18 December 2019 в 14:46
поделиться
public void AddScriptToPage(string href, string elementId) 

.. will get called. Компилятор выбирает сигнатуру с наиболее точным совпадением, при этом параметры имеют наименьший приоритет.

5
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: