#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
}
поскольку предпочтительнее вызывать метод без параметра, а не метод с перегрузкой необязательного параметра
Разрешение перегрузки
- Метод, индексатор или конструктор являются кандидатами на выполнение, если каждый из его параметров либо является необязательным, либо соответствует, по имени или по позиции, одному аргументу в вызывающем операторе, и этот аргумент может быть преобразован в тип параметра.
- Если найдено более одного кандидата, правила разрешения перегрузки для предпочтительных преобразований применяются к аргументам, которые явно указаны. Пропущенные аргументы для необязательных параметров игнорируются.
- Если два кандидата считаются одинаково хорошими, предпочтение отдается кандидату, у которого нет необязательных параметров, аргументы для которых были опущены в вызове. Это следствие общего предпочтения в разрешении перегрузки для кандидатов с меньшим количеством параметров.