Параметр по умолчанию против параметра без параметра

#c# #.net #c#-4.0

#c# #.net #c #-4.0

Вопрос:

У меня есть два метода, как показано ниже. Один без параметров и один только с необязательными параметрами.

 void GetNext(){
   //implimentation
}

void GetNext(int currentindex = 0){
   //implimentation
}
 

Теперь, какой метод будет вызываться при вызове GetNext без аргумента

  GetNext();
 

и почему?

К вашему сведению: об этом спрашивали в одном из интервью.

Ответ №1:

Вызывается метод без необязательного параметра ( GetNext() ). Ответ почему можно найти в MSDN:

Если два кандидата считаются одинаково хорошими, предпочтение отдается кандидату, у которого нет необязательных параметров, аргументы для которых были опущены в вызове. Это следствие общего предпочтения в разрешении перегрузки для кандидатов с меньшим количеством параметров.

Ответ №2:

будет вызван void GetNext(), в этом случае метод с необязательным параметром скрыт. Но если вы вызовете GetNext(1), будет вызван GetNext(int currentindex = 0) .

Ответ №3:

Без параметра GetNext() будет вызван метод

 void GetNext(){
   //implimentation
}
 

поскольку предпочтительнее вызывать метод без параметра, а не метод с перегрузкой необязательного параметра

Разрешение перегрузки

  • Метод, индексатор или конструктор являются кандидатами на выполнение, если каждый из его параметров либо является необязательным, либо соответствует, по имени или по позиции, одному аргументу в вызывающем операторе, и этот аргумент может быть преобразован в тип параметра.
  • Если найдено более одного кандидата, правила разрешения перегрузки для предпочтительных преобразований применяются к аргументам, которые явно указаны. Пропущенные аргументы для необязательных параметров игнорируются.
  • Если два кандидата считаются одинаково хорошими, предпочтение отдается кандидату, у которого нет необязательных параметров, аргументы для которых были опущены в вызове. Это следствие общего предпочтения в разрешении перегрузки для кандидатов с меньшим количеством параметров.