Вопрос должен заключаться не в том, «есть ли преимущества для перегрузок», а скорее в том, «каковы преимущества методов расширения, которые делают их превосходящими перегрузки?» На мой взгляд, недостатки методов расширения намного перевешивают любые предполагаемые преимущества. На самом деле, я не могу представить какое-либо преимущество, которое предоставляют методы расширения при разработке класса.
Предположим, например, что у вашего класса есть этот метод:
public int Frob(int count)
Но наиболее распространенный ожидаемый вариант использования - это когда клиенты вызывают его со значением count
, равным 1. Итак, вы хотите создать метод Frob()
, который не требует этого параметра.
Конечно, в .NET 4.0 вы можете сделать это с параметрами по умолчанию, но, как вы говорите, параметры по умолчанию не всегда являются опцией, потому что они должны стоять последними. Таким образом, без параметров по умолчанию у вас есть возможность 1) создать перегрузку; или 2) создание метода расширения.
Создать перегрузку просто. Создание метода расширения требует статического класса и статического метода и предоставляет возможность непреднамеренного сокрытия - все сложности, которые не приносят пользы. Зачем использовать методы расширения для эмуляции перегрузок, если вы можете просто написать перегрузку dang и покончить с этим?
Если вы не можете изменить класс, тогда методы расширения являются очевидным выбором. Но, если у вас есть выбор, используйте функцию, разработанную для обеспечения требуемой функциональности.