Почему статический метод в нестатическом классе не может быть методом расширения?
Возможный дубликат:
метод расширения требует, чтобы класс был статическим
В .NET:
Почему не может статический метод в нестационарный класс использовать метод расширения?
Ответы
Ответ 1
Эрик Липперт, вероятно, будет взвешен с действительно хорошим ответом на этом, но суть его, вероятно, будет:
Мы решили, что было бы проще как для программистов, так и для компилятора, если мы ограничим количество мест, которые вам нужны для методов расширения.
Эта политика имеет тенденцию заставлять пользователей ставить все свои методы расширения на несколько определенных классов, предназначенных для этой цели.
Ответ 2
Имеет смысл, что для использования методов расширения требуется статический класс. Причина номер один заключается в том, что статический класс не имеет состояния... т.е. вам не нужно указывать класс.... но это только мое чувство кишки. Для меня это не имело бы смысла.
Я также думаю, что принудительное использование методов расширения для публичных/внутренних статических классов снижает стоимость их использования.
Ответ 3
Потому что, ну, так оно и есть.
Я предполагаю, что использование статических методов расширения затруднит язык (каждая функция добавляет сложности того или иного типа) при добавлении почти нулевой выгоды. Если вы определяете статический метод на String
, например, что польза от этого, когда вы можете просто определить свой собственный класс с тем же статическим методом?
Методы расширения уровня экземпляра полезны, поскольку они работают с текущим состоянием экземпляра типа. Статический метод не имеет контекста, поэтому он не будет предоставлять какую-либо утилиту по статическому методу, определенному в другом месте, кроме логической группировки (т.е. Определение a String.IsNullOrFullOfSomeChar(char c)
логически имеет смысл принадлежать классу String
, но помимо этого не является преимуществом. И да, это был бы ужасный метод, просто пример).
Методы расширения появились в результате LINQ. Они были реализованы, чтобы LINQ работал так, как хотели дизайнеры. Статические расширения не требовались и, как таковые, они не были реализованы.
Ответ 4
Во время компиляции, когда вы используете саксофон синтаксиса экземпляра для методов расширения, он преобразуется в вызов статического метода (который определяет расширение) и проходит через ваш экземпляр.
Помимо хорошего синтаксиса, он не отличается от реализации статического метода и передачи вашего экземпляра в качестве аргумента. Это именно то, что происходит. Вы не можете сделать это со статическими классами, поскольку вы не можете передать статический класс в качестве параметра методу.