В таких языках, как C ++, значение по умолчанию может быть включено как часть объявления метода:
void Process (Сотрудник сотрудника, бонус bool = false)
Этот метод можно вызвать с помощью:
a.Process (сотрудник, верно);
или
a.Process (работник);
во втором случае для параметра бонус устанавливается значение false.
C # не имеет этой функции.
Одна из причин, по которой у нас нет этой функции, связана с конкретной реализацией функции. В мире C ++, когда пользователь пишет:
a.Process (работник);
компилятор генерирует
a.process (сотрудник, ложь);
Другими словами, компилятор принимает значение по умолчанию, указанное в прототипе метода, и помещает его в вызов метода - это так же, как если бы пользователь написал «false» в качестве второго параметра. Нет никакого способа изменить это значение по умолчанию, не заставляя пользователя класса перекомпилировать, что является неудачным.
Модель перегрузки лучше работает в этом отношении. Автор фреймворка просто определяет два отдельных метода, а однопараметрический вызывает двухпараметрический метод. Это сохраняет значение по умолчанию в платформе, где оно может быть изменено при необходимости.
Компилятор мог бы взять что-то вроде определения C ++ и создать перегрузки, но с этим подходом есть несколько проблем.
Во-первых, корреляция между кодом, который пишет пользователь, и кодом, генерируемым компилятором, менее очевидна. Обычно мы стараемся ограничивать магию, когда это возможно, поскольку это усложняет работу программистов. Вторая проблема связана с такими вещами, как комментарии к документам XML и intellisense. Компилятор должен иметь специальные правила для того, как он генерирует комментарии к документу для перегруженных методов, а у intellisense должны быть смарты для свертывания перегруженных методов в один метод.
Писать перегрузки немного менее удобно, но мы думаем, что это приемлемое решение.