Более или менее одинаковые перегрузки

Следующий код компилируется в С# 4.0:

void Foo(params string[] parameters) { }
void Foo(string firstParameter, params string[] parameters) { }

Как компилятор знает, какую перегрузку вы вызываете? И если это невозможно, почему код все еще компилируется?

Ответ 1

Он хорошо указан в Спецификации языка С#, глава 7.4.3.2, "Лучшая функция":

В противном случае, если MP применим в своей нормальной форме, а MQ имеет массив params и применим только в его расширенной форме, то MP лучше, чем MQ

В противном случае, если MP имеет меньше объявленных параметров, чем MQ, MP лучше, чем MQ. Это может произойти, если оба метода имеют массивы params и применимы только в их расширенных формах.

Fwiw, спецификация языка С# является очень читаемым документом и может помочь вам решить эти головоломки самостоятельно. У вас есть это на вашей машине, найдите его в каталоге установки Visual Studio (например, c:\program files\microsoft visual studio 9.0) в подкаталоге vС#\specification\1033.

Другим хорошим является стандартный документ Ecma-335, свободно доступный как Загрузка PDF. Он определяет поведение CLR и JIT-компилятора, отличный материал, чтобы понять, почему С# (и CLR) выполняют то, что они делают. Рекомендуется.

Ответ 2

В некоторых случаях он решит для вас. Таким образом, вы можете использовать разные имена в таких случаях (или в более полезных случаях:-)).

В частности, из четырех случаев:

        Foo("bar");
        Foo("bar", "bar");
        Foo(new string[]{"bar", "bar"});
        Foo("bar", new string[] { "bar", "bar" });

только # 1 и # 2 являются "неоднозначными" (поскольку # 3 и # 4, естественно, соответствуют перегрузкам 1 и 2 соответственно).

В случаях, когда разрешение перегрузки # 1 и # 2 выбирает перегрузку # 2, поскольку она имеет автономный строковый параметр, который соответствует единственному/первому параметру вызова.