Как C# выбирает с неоднозначностью и параметрическими усилителями

Скажите, что у меня есть следующие методы:

public static void MyCoolMethod(params object[] allObjects)
{
}

public static void MyCoolMethod(object oneAlone, params object[] restOfTheObjects)
{
}

Если я делаю это:

MyCoolMethod("Hi", "test");

какой называют и почему?

14
задан Vaccano 6 July 2010 в 21:07
поделиться

3 ответа

Это легко проверить - второй метод вызывается.

Что касается причин - спецификация языка 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 обрабатываются в обычной и расширенной формах, но в конечном итоге эмпирическое правило гласит, что будет вызвана наиболее специфическая перегрузка с точки зрения количества и типа параметров.

15
ответ дан 1 December 2019 в 12:37
поделиться

Эта перегрузка сложна ...

MyCoolMethod («Hi», «test») явно вызывает вторую перегрузку, но

MyCoolMethod («Hi»); также вызывает вторую перегрузку. Я это проверил.

Возможно, поскольку оба входа являются объектами, компилятор предполагает, что все переданное будет массивом объектов, и полностью игнорирует 1-ю перегрузку.

Вероятно, это связано с улучшением разрешения функций-членов, упомянутым womp. http://msdn.microsoft.com/en-us/library/aa691338 (v = VS.71) .aspx

1
ответ дан 1 December 2019 в 12:37
поделиться

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

6
ответ дан 1 December 2019 в 12:37
поделиться
Другие вопросы по тегам:

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