Приличный способ думать об этом - это то, что методы экземпляра - это что-то, сделанное с помощью объекта, а методы расширения - это то, что делается от до объекта. Я вполне уверен, что в Руководстве по проектированию фреймворка сказано, что вам следует по возможности реализовывать метод экземпляра.
Интерфейс объявляет: «Я забочусь об использовании этой функциональности, но не о том, как она выполняется». Это оставляет исполнителям свободу выбора как. Он отделяет намерение, публичный API, от механизма, класса с конкретным кодом.
Поскольку это является основным преимуществом интерфейсов, их полная реализация в качестве методов расширения, по-видимому, противоречит их цели. Даже IEnumerable<T>
имеет метод экземпляра.
Редактировать : Кроме того, объекты должны воздействовать на данные, которые они содержат. Методы расширения могут видеть только открытый API объекта (поскольку они являются просто статическими методами); вам нужно было бы раскрыть все состояния объекта, чтобы он работал (OO no-no).