Я имею в виду, я уверен, что это хорошая привычка, но есть ли какие-либо технические/концептуальные причины, почему это обеспечивается компилятором? Или это только усиливает эстетику?Почему методы расширения могут быть определены только в статических классах?
ответ
Для этого поведения ниже уровня C# нет причин. Начиная с методов расширения уровня IL и статических классов не существует (кроме как незначительных изменений, так и пользовательских атрибутов).
Это выбор, сделанный разработчиками языка, предположительно для ясности кода. Это не должно быть таким образом по какой-либо фундаментальной причине.
Существуют и другие подобные ограничения. Например, вы не можете иметь расширения, определенные во вложенных классах.
Для моего понимания это концептуальный ход.
Статический класс действует как чистый контейнер для методов и сам не представляет объекта, а метод расширения самого по себе является метода, который обрабатывает только входа и не действует как часть поведения объектов.
Вот почему я думаю, что они очень похожи по своей природе на C#, и, вероятно, именно поэтому они связаны между собой языком.
- 1. Методы расширения не допускаются во вложенных статических классах?
- 2. Почему методы не могут быть определены внутри определения метода
- 3. Почему методы `singleton` не могут быть определены в классах` Fixnum`, `Bignum`,` Float`, `Symbol`, но` FalseClass` и `TrueClass` могут иметь?
- 4. Могут ли быть частные методы расширения?
- 5. Методы расширения не могут быть динамически отправлены
- 6. Почему методы расширения не могут быть решены для динамических типов?
- 7. Могут ли методы быть определены за пределами класса?
- 8. Почему методы интерфейса не могут быть «статическими» и «окончательными»?
- 9. Почему классы могут быть созданы в статических классах, таких как main?
- 10. Почему методы jQuery не могут быть сохранены?
- 11. нестатические классы в статических классах
- 12. Почему я продолжаю получать ошибку? Методы расширения должны быть определены в неэквивалентном статическом классе?
- 13. Могут ли быть генераторы в классах?
- 14. Почему я не могу создавать методы расширения для статических классов?
- 15. Конкуренция в статических классах
- 16. C++: статические члены не могут быть определены в декларации, но могут использоваться переменные статической функции?
- 17. Использование методов расширения в статических методах на расширенных классах
- 18. Объекты не определены в классах
- 19. Почему свойства не могут быть прочитаны только?
- 20. Swift: методы класса могут быть объявлены только для типа
- 21. Методы в объектно-ориентированных парадигмах могут быть переопределены методами с одинаковой сигнатурой в наследующих классах. Переменные однако не могут. Зачем?
- 22. Могут ли методы быть определены в инициализаторе объекта без использования ключевого слова `function`?
- 23. Объектные экземпляры в статических классах
- 24. Конкретные методы в интерфейсных классах
- 25. Расширения Zune не могут быть установлены
- 26. Почему методы могут быть добавлены как параметры в Java
- 27. Почему методы в Enumerable могут быть без тела метода?
- 28. C методы # расширения в статических условиях и производные типы
- 29. Могут ли применяться методы расширения до интерфейсов?
- 30. Могут ли методы расширения иметь общие параметры?
Возможный дубликат http://stackoverflow.com/questions/3930335/why-are-extension-methods-only-allowed-in-non-nested-non-generic-static-class?lq=1 http://stackoverflow.com/questions/2618271/why-is-it-impossible-to-declare-extension-methods-in-a-generic-static-class?lq=1 http://stackoverflow.com/questions/2731695/extension-method-требует-class-to-be-static? lq = 1 – MichaC
Возможно, это ускоряет поиск методов расширения в компиляторе, поскольку для этого требуется меньше. Но я не уверен, что пометка классов с атрибутами не будет работать лучше, или если это вообще имеет значение (вам нужно только один раз ходить, после этого читать из индексированного кеша) – CodesInChaos