Более или менее равные перегрузки - PullRequest
11 голосов
/ 27 июня 2010

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

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

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

Ответы [ 2 ]

13 голосов
/ 27 июня 2010

Это хорошо указано в спецификации языка C #, глава 7.4.3.2, «Лучший функциональный член»:

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

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

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

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

6 голосов
/ 27 июня 2010

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

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

        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, поскольку она имеет отдельную строкупараметр, который соответствует единственному / первому параметру вызова.

...