Существование расширенных методов весьма вероятно из-за необходимости для Microsoft добавить функциональность к IEnumerable
без изменения интерфейса. Если бы они добавили методы к интерфейсу, то все существующие реализации IEnumerable
(включая Microsoft) больше не будут компилироваться.
Альтернативой изменению IEnumerable
является создание служебного класса (называемого Enumerable
), который имеет методы, которые выполняют преобразования для экземпляров IEnumerable
. Это работает, за исключением того, что пользовательский интерфейс отличается от вызова метода из существующего экземпляра IEnumerable
. Например, сравните следующие эквивалентные утверждения.
IEnumerable<string> strings = myIntList.Select(num => num.ToString())
.Where(num => num.StartsWith('T'));
IEnumerable<string> strings =
Enumerable.Where(
Enumerable.Select(myIntList, num => num.ToString()),
num => num.StartsWith('T'));
Чтобы достичь лучшего из обоих миров, команда компилятора C # добавила поддержку методов расширения, позволив создать класс Enumerable
со специальным синтаксисом и сохранив тот же пользовательский опыт, добавив методы для IEnumerable
для начала. с.