Так что было много комментариев о том, что метод расширения ForEach не подходит, потому что он не возвращает значение, подобное методам расширения LINQ. Хотя это фактическое утверждение, оно не совсем верно.
Все методы расширения LINQ возвращают значение, чтобы их можно было объединить в цепочку:
collection.Where(i => i.Name = "hello").Select(i => i.FullName);
Однако тот факт, что LINQ реализован с использованием методов расширения, не означает, что методы расширения должны использоваться одинаково и возвращать значение. Написание метода расширения для предоставления общих функций, которые не возвращают значение, является вполне допустимым использованием.
Конкретный аргумент о ForEach заключается в том, что, основываясь на ограничениях на методы расширения (а именно, что метод расширения никогда не переопределит унаследованный метод с такой же сигнатурой ), может быть ситуация, когда пользовательский метод расширения доступен на всех классах, которые реализуют IEnumerable <T
>, кроме List <T
>. Это может вызвать путаницу, когда методы начинают вести себя по-разному в зависимости от того, вызывается ли метод расширения или метод наследования.