Необязательные параметры действуют как константы и заменяются во время компиляции.
public void Foo(string s = "default")
Foo();
Сгенерирует код для звонящего:
public void Foo(string s)
Foo("default");
Это означает, что все сборки, ссылающиеся на вашу, будут иметь СТАРОЕ значение по умолчанию, если вы решите изменить значение по умолчанию в новой версии!
Перегрузки не действуют как константы и скрывают значения по умолчанию в вашей сборке. Это дает чистый путь обновления.