Скажите, что у меня есть следующие методы:
public static void MyCoolMethod(params object[] allObjects)
{
}
public static void MyCoolMethod(object oneAlone, params object[] restOfTheObjects)
{
}
Если я делаю это:
MyCoolMethod("Hi", "test");
какой называют и почему?
Это легко проверить - второй метод вызывается.
Что касается причин - спецификация языка C# содержит довольно подробные правила о том, как разрешаются неоднозначные объявления функций. На SO есть много вопросов по интерфейсам, наследованию и перегрузкам с некоторыми конкретными примерами того, почему вызываются различные перегрузки, но для ответа на этот конкретный случай:
C# Specification - Overload Resolution
7.5.3.2 Better function member
For the purposes of determining the лучшего члена функции, список аргументов сокращенный список аргументов A строится список аргументов A, содержащий только сами выражения аргументов в том в порядке их появления в исходном списке аргументов.
Списки параметров для каждого из членов функции-кандидата строятся следующим образом:
Расширенная форма используется, если член функции применим только в расширенной форме.
Необязательные параметры, не имеющие соответствующих аргументов, удаляются из списка параметров
Параметры переупорядочиваются так, чтобы они встречались в той же позиции, что и соответствующий аргумент в списке аргументов.
И далее...
Если последовательности типов параметров {P1, P2, ..., PN} и {Q1, Q2, ..., QN} эквивалентны > (т.е. каждый Pi имеет тождественное преобразование к соответствующему Qi), то следующие для определения лучшего члена функции применяются следующие правила разделения по порядку.
Если MP - негенеративный метод, а MQ - генеративный метод, то MP лучше, чем MQ.
В противном случае, если MP применим в своей обычной форме, а MQ имеет массив params и применяется применим только в расширенной форме, то MP лучше, чем MQ.
Иначе, если MP имеет больше объявленных параметров, чем MQ, то MP лучше, чем MQ. Это может произойти, если оба метода имеют массивы params и применимы только в их расширенной форме.
Похоже, что в данном случае применяется выделенное жирным правило определения ничьей. В спецификации подробно описано, как массивы params обрабатываются в обычной и расширенной формах, но в конечном итоге эмпирическое правило гласит, что будет вызвана наиболее специфическая перегрузка с точки зрения количества и типа параметров.
Эта перегрузка сложна ...
MyCoolMethod («Hi», «test») явно вызывает вторую перегрузку, но
MyCoolMethod («Hi»); также вызывает вторую перегрузку. Я это проверил.
Возможно, поскольку оба входа являются объектами, компилятор предполагает, что все переданное будет массивом объектов, и полностью игнорирует 1-ю перегрузку.
Вероятно, это связано с улучшением разрешения функций-членов, упомянутым womp. http://msdn.microsoft.com/en-us/library/aa691338 (v = VS.71) .aspx
Второй: компилятор сначала попытается разрешить явно объявленные параметры, прежде чем вернуться к коллекции параметров.