¿Por qué los métodos de extensión requieren que la clase de declaración sea estática? ¿Es un requisito del compilador?Los métodos de extensión requieren que la clase declarada sea estática
Respuesta
Se dictada en la especificación del lenguaje, sección 10.6.9 de la C# 4 spec:
Cuando el primer parámetro de un método incluye el este modificador, que método se dice que es una extensión método. Los métodos de extensión solo pueden ser declarados en clases estáticas no genéricas, no anidadas . El primer parámetro de un método de extensión no puede tener modificadores que no sean este, y el tipo de parámetro no puede ser un tipo de puntero .
No es claro por qué todos de estas restricciones son necesarias - que no sea potencialmente para compilador (y especificación del lenguaje) simplicidad. Puedo ver por qué tiene sentido restringirlo a tipos no genéricos, pero no puedo ver de inmediato por qué tienen que ser no anidados y estáticos. Sospecho que hace que las reglas de búsqueda sean considerablemente más simples si no tienes que preocuparte por los tipos incluidos en el tipo actual, etc., pero me atrevo a decir que sería posible.
Sospecho que la complejidad adicional de no tener estas restricciones se consideró menor que el beneficio obtenido.
EDITAR: Para que quede claro, no estoy sugiriendo que tendría sentido tener métodos de instancia como métodos de extensión - Estoy sugiriendo que tendría sentido tener un método de extensión estático en un anidado y/o clase no estática
@Jon: ¿Cómo funcionaría una implementación no estática? ¿Qué instancia de la clase de método de extensión usaría una llamada? –
Estoy con Adam, si no fuera estático, ¿cómo se determinaría la instancia específica para llamar? ¿Qué significaría si hubiera varias instancias? –
@ Adam: No estaba sugiriendo que un método no estático tuviera sentido. Estaba sugiriendo que un * tipo * no estático tendría sentido. –
- 1. ¿Métodos de extensión en una clase estática?
- 2. ¿Puedo agregar métodos de extensión a una clase estática existente?
- 3. ¿Cómo agrupar los métodos de extensión?
- 4. Reemplazando los métodos de extensión
- 5. ¿Cuándo quisiera que mi clase privada sea estática?
- 6. métodos de extensión estáticas
- 7. ¿Los métodos de extensión ocultan las dependencias?
- 8. protocolos Objective C que requieren la aplicación de al menos uno de un conjunto de métodos
- 9. ¿Los métodos LINQ son métodos de extensión?
- 10. ¿Cómo extiendo una clase con los métodos de extensión C#?
- 11. método de extensión para extender la clase estática
- 12. que imita una clase estática
- 13. Métodos de extensión estática en el módulo Seq
- 14. Cómo se conectan los métodos de extensión
- 15. métodos de extensión deben ser definidos en una clase estática no genérico
- 16. ¿Por qué es imposible declarar métodos de extensión en una clase genérica estática?
- 17. ¿Cuál es la diferencia entre los métodos estáticos en una clase no estática y los métodos estáticos en una clase estática?
- 18. ¿Cuándo deberían evitarse los métodos de extensión?
- 19. ¿Métodos de extensión virtual?
- 20. ¿Por qué los métodos de extensión solo se permiten en clase estática no anidada y no genérica?
- 21. ¿Por qué son "estáticos" y "esto" necesarios para los métodos de extensión, y cómo se asigna su memoria?
- 22. ¿Cómo se accede a la variable declarada en una extensión de clase?
- 23. Organización de métodos de extensión
- 24. ¿Cómo se compilan los métodos de extensión?
- 25. ¿Qué son los métodos de extensión?
- 26. Los métodos estáticos de extensión de apoyo limitaciones miembros
- 27. Redefina los métodos de clase o clase
- 28. Métodos de extensión vs Static Utility Class
- 29. ¿Podría abstraer sus consultas LINQ en los métodos de extensión
- 30. ¿Cuándo ocurre la inicialización de clase estática?
posible duplicado de [¿Por qué los métodos de extensión solo se permiten en clase estática no anidada, no genérica?] (Http://stackoverflow.com/questions/3930335/why-are-extension-methods-only-allowed- in-non-nested-non-generic-static-class) – nawfal