¿Por qué los métodos de extensión solo se permiten en clases estáticas no genéricas y no anidadas? ¿Es inútil considerar los métodos de extensión en clase estática anidada genérica?¿Por qué los métodos de extensión solo se permiten en clase estática no anidada y no genérica?
Respuesta
¿Por qué los métodos de extensión solo se permiten en clase estática no anidada y no genérica?
Como Pratik señala, la pregunta que nos enfrentamos no es "¿por qué son los métodos de extensión no permitidos en clases anidadas o genéricos?" La pregunta que enfrentamos como diseñadores de idiomas es "¿por qué deberían permitirse los métodos de extensión en clases anidadas o genéricas?"
A menos que la función esté justificada por alguna necesidad del usuario en el mundo real, no vamos a asumir los costos considerables de diseñar, implementar, probar, documentar y mantener la función.
Básicamente, los métodos de extensión se diseñaron para hacer que LINQ funcione. Todo lo que no contribuyó a hacer que LINQ funcione fue cortado. LINQ solo necesita métodos de extensión en clases estáticas, no genéricas, no anidadas para trabajar, así que eso es lo que diseñamos e implementamos.
Si tiene un escenario donde los métodos de extensión serían útiles en clases no estáticas, genéricas o anidadas, me complace echarle un vistazo al escenario. Cuantos más escenarios del mundo real obtengamos, más probable será que creemos una función en algún lenguaje futuro hipotético que beneficie esos escenarios.
¿Es inútil considerar los métodos de extensión en la clase estática genérica anidada?
No, es una gran idea para considerarlo. Seríamos negligentes en nuestros deberes si no lo consideramos. Lo consideramos cuidadosamente durante mucho tiempo y decidimos que, sobre la base de esa consideración, los costos de la prestación no estaban justificados por los beneficios acumulados.
Creo que esto se hizo para que el compilador pueda localizar/buscar el método de extensión en un tiempo razonable. Además, tenga en cuenta que los métodos de extensión de búsqueda de compilador solo en el conjunto de espacios de nombres que se encuentran en el alcance del archivo, esto también se hace por motivos similares.
Si piensa en un escenario de clase estático genérico, el compilador debe intentar crear una instancia de los tipos concretos para todas las combinaciones de tipos posibles para coincidir con el método de extensión. Incluso si complier puede ser inteligente al hacer esto, instanciar el tipo concreto para llamar a los métodos de extensión puede tener un efecto secundario que el desarrollador puede desconocer.
Sin embargo, todavía podría tenerlos en alcance dondequiera que esté la clase. Es decir, las extensiones de una clase estática anidada estarían dentro del alcance de la clase de ajuste; y, en particular, eso no es problemático, incluso si la clase de envoltura no es estática y genérica. –
He escuchado este argumento (restricción de métodos de extensión a clases estáticas no anidadas, no genéricas para acelerar su descubrimiento) anteriormente, pero ya no estoy tan convencido: sospecho que sería posible identificar muy rápidamente todos los métodos estáticos en un ensamblaje que está decorado con un 'ExtensionAttribute', es decir, escaneando la tabla de metadatos CLI' CustomAttribute' (vea el capítulo II.22.10 de la [especificación CLI (ECMA-335)] (http: //www.ecma-international. org/publications/files/ECMA-ST/ECMA-335.pdf)). – stakx
Como Eric Lippert ha escrito muchas veces en su blog, cada cambio a C# se evalúa cuidadosamente contra un conjunto de criterios para justificarlo y no solo por razones de tecnología. En este caso, lo que no se requería para habilitar LINQ se cortó para reducir el riesgo. Compruebe esto blog post de Eric para una pregunta similar.
- 1. ¿Por qué es imposible declarar métodos de extensión en una clase genérica estática?
- 2. ¿No se permiten los métodos de extensión en las clases estáticas anidadas?
- 3. No se permiten las funciones anidadas, pero ¿por qué se permiten los prototipos de función anidada? [C++]
- 4. ¿Métodos de extensión en una clase estática?
- 5. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 6. ¿Por qué no puede invocar los métodos de extensión directamente?
- 7. ¿Los métodos de extensión C# no permiten pasar parámetros por referencia?
- 8. anidada genérica en una clase genérica
- 9. ¿Por qué tienen todos los métodos/variables estáticos en una clase no estática?
- 10. ¿Por qué los idiomas no permiten la sobrecarga de métodos por valor de retorno?
- 11. ¿Por qué los operadores no pueden estar sobrecargados dentro de una clase estática?
- 12. ¿Por qué no se permiten bitfields en OpenCL?
- 13. ¿Por qué no se encuentran los encabezados de biblioteca estática?
- 14. ¿Cómo se definen los métodos de extensión para la clase genérica?
- 15. ¿Puedo agregar métodos de extensión a una clase estática existente?
- 16. ¿Por qué los atributos de PHP no permiten funciones?
- 17. Los métodos de extensión definidos en los tipos de valores no se pueden usar para crear delegados. ¿Por qué no?
- 18. C# Métodos de extensión solo visibles y accesibles dentro de una clase ("privada")
- 19. Métodos de extensión no reconocidos
- 20. ¿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?
- 21. Clase genérica estática como diccionario
- 22. Cómo se conectan los métodos de extensión
- 23. ¿Por qué son "estáticos" y "esto" necesarios para los métodos de extensión, y cómo se asigna su memoria?
- 24. métodos de extensión deben ser definidos en una clase estática no genérico
- 25. ¿Por qué no se permite sobrecargar los métodos dentro de los métodos (por ejemplo, cierres sobrecargados)?
- 26. Por qué no se permiten los resultados de redireccionamiento en Acciones secundarias en Asp.net MVC 2
- 27. PowerMock clase estática no se burlan
- 28. ¿Por qué no se resuelven estos métodos?
- 29. ¿Por qué usamos "esto" en los Métodos de extensión?
- 30. por qué los métodos de extensión en C# Class Libraries
OK. Gracias. Buena y clara explicación! Por el bien de LINQ ... – xport
@EricLippert: Encontré este artículo después de intentar crear un método de extensión en una clase no estática y luego en una clase interna estática. Lo hice porque quería crear un método de "instancia" nulo seguro que devolviera un valor predeterminado (en este caso nulo, así que supongo que podría considerarse un caso de acceso de miembro de propagación nula, aunque realmente estaba pensando en desde una vista más genérica). Sería genial si la mayoría, si no todos, de los métodos de Strings fueran así; es probable que ya sea demasiado tarde para eso, pero si hubiera estado disponible al principio ... – jmoreno
posiblemente mi pregunta, que es esencialmente un duplicado de este proporciona un ejemplo del mundo real (?) ... http://stackoverflow.com/questions/11443842/why-not-allow-extension-method-definition-in-nested-class –