Хотя многие статические методы, особенно для типов значений и строк, работают с экземплярами самих себя, существуют статические методы, для которых синтаксис расширения не имеет смысла, поскольку они не действуют на свой собственный тип. Например, ConfigurationManager является «чисто статическим», в котором нет компонента экземпляра; нет смысла пытаться структурировать любой такой вызов как метод расширения.
Я также попал в ситуации, когда у меня были ссылки на дубликаты методов расширения в разных служебных библиотеках с похожими сигнатурами; обращение к статическому классу, содержащему метод, является единственным способом устранения таких неоднозначностей без большого рефакторинга.
Наконец, методы расширения хороши в умеренности. Тем не менее, мой текущий проект стал, пожалуй, слишком «беглым»; у нас есть обертки для метода расширения для большей части статики String, такие как IsNullOrEmpty () и Format (), а также методы разбора для каждого типа значения (обертки для int.Parse, byte.Parse, DateTime.Parse и т. д.) и вариантов (например, TryParses, IsNullOrBlank, IsNotNullOrEmpty и т. д.). Есть много вещей, которые вы можете сделать с экземпляром строки, и в нашем проекте большинство из них можно прикрепить к концу этого экземпляра (даже литералу). Это значительно замедляет VS, когда вы достигаете этого периода, и увеличивает объем используемой памяти (и ReSharper, который предоставляет расширения IntelliSense и предложения / рекомендации по использованию).