2010-04-28 6 views
19

¿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

+0

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

Respuesta

26

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

+2

@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? –

+0

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? –

+2

@ Adam: No estaba sugiriendo que un método no estático tuviera sentido. Estaba sugiriendo que un * tipo * no estático tendría sentido. –

Cuestiones relacionadas