Нет метода расширения в нестатическом универсальном классе?

Почему невозможно объявить/реализовать метод расширения в классе, который не является статическим?

Я знаю, что Extension-Method бесполезен для неэкземплярных типов. Но почему бы не реализовать это в экземпляре класса? Что является причиной этого? Является ли это технической проблемой или просто для того, чтобы быстрее найти методы или улучшить дизайн программного обеспечения?


person 0xDEADBEEF    schedule 23.07.2013    source источник
comment
возможный дубликат Почему не поддерживаются методы расширения статического класса С#?   -  person Reed Copsey    schedule 23.07.2013
comment
Дубликат stackoverflow.com/questions/3930335/   -  person Andrew Coonce    schedule 23.07.2013


Ответы (2)


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

http://msdn.microsoft.com/en-us/library/vstudio/79b3xss3.aspx

Иметь методы расширения edit: static new'd в дочерних классах, и это было бы настоящей болью.

Как и в случае со всеми типами классов, информация о типе для статического класса загружается общеязыковой средой выполнения (CLR) .NET Framework при загрузке программы, которая ссылается на класс.

Статические классы находятся выше в цепочке приоритетов инициализации, что делает реализацию немного более эффективной.

person Louis Ricci    schedule 23.07.2013
comment
Я бы предположил, что даже в нестатическом классе сами методы расширения все равно должны быть static, поэтому вы все равно не сможете их переопределить. - person Chris Sinclair; 23.07.2013
comment
@ChrisSinclair - я имел в виду новый модификатор msdn.microsoft.com/en-us/library/ - person Louis Ricci; 23.07.2013
comment
Такая же разница. Статические методы принадлежат тому типу, для которого они объявлены. Сокрытие статических методов с использованием new имеет эффект только в том случае, если внутри класса (или его производных подклассов) статические методы вызываются без явного указания типа. Если только вы не предполагаете, что если вы объявите метод расширения базового класса Bar в пространстве имен A, объявите производный класс Foo : Bar в пространстве имен B, а затем добавите using B; для импорта методов расширения из B.Foo, он также проползет вверх и захватит методы расширения из A.Bar. ? Страшно - person Chris Sinclair; 23.07.2013

Для работы LINQ нужны только методы расширения в статических, неуниверсальных, не вложенных классах, поэтому он спроектирован и реализован именно так. Если бы это требовалось для нестатических, универсальных, вложенных классов, оно было бы реализовано таким образом.

person Ehsan    schedule 23.07.2013