usar una son qué programacion método metodos metodo los genérica extensión estáticos estática estaticos estaticas definirse debe cuando clases clase atributos c#

c# - una - ¿Por qué los métodos de extensión solo se permiten en clases estáticas no genéricas y no anidadas?



static programacion (3)

¿Por qué los métodos de extensión solo se permiten en clases estáticas no genéricas y no anidadas?

Como señala Pratik, la pregunta que enfrentamos no es "¿por qué los métodos de extensión no están permitidos en las clases anidadas o genéricas?" 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 considerables costos de diseñar, implementar, probar, documentar y mantener la función.

Básicamente, los métodos de extensión fueron diseñados 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 una clase estática genérica anidada?

No, es una gran idea 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.

¿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 una clase estática genérica anidada?


Como Eric Lippert ha escrito muchas veces en su blog, cada cambio a C # se evalúa cuidadosamente en función de un conjunto de criterios para justificarlo y no solo en función de la tecnología. En este caso, lo que no se requería para habilitar LINQ se cortó para reducir el riesgo. Consulte esta publicación de blog de Eric por una pregunta similar.


Creo que esto se hizo para que el compilador pueda ubicar / 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 que coincida 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.