2013-10-05 3 views
1

Я имею в виду, я уверен, что это хорошая привычка, но есть ли какие-либо технические/концептуальные причины, почему это обеспечивается компилятором? Или это только усиливает эстетику?Почему методы расширения могут быть определены только в статических классах?

+2

Возможный дубликат 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

+0

Возможно, это ускоряет поиск методов расширения в компиляторе, поскольку для этого требуется меньше. Но я не уверен, что пометка классов с атрибутами не будет работать лучше, или если это вообще имеет значение (вам нужно только один раз ходить, после этого читать из индексированного кеша) – CodesInChaos

ответ

1

Для этого поведения ниже уровня C# нет причин. Начиная с методов расширения уровня IL и статических классов не существует (кроме как незначительных изменений, так и пользовательских атрибутов).

Это выбор, сделанный разработчиками языка, предположительно для ясности кода. Это не должно быть таким образом по какой-либо фундаментальной причине.

Существуют и другие подобные ограничения. Например, вы не можете иметь расширения, определенные во вложенных классах.

1

Для моего понимания это концептуальный ход.

Статический класс действует как чистый контейнер для методов и сам не представляет объекта, а метод расширения самого по себе является метода, который обрабатывает только входа и не действует как часть поведения объектов.

Вот почему я думаю, что они очень похожи по своей природе на C#, и, вероятно, именно поэтому они связаны между собой языком.

Смежные вопросы