Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.1K
Vistas
¿Por qué no puedo definir métodos de extensión de nivel superior en C# 9?

Pensé que el uso de la función de declaraciones de nivel superior en C# 9 esencialmente envuelve su código de nivel superior en la clase Program habitual y el método Main .

Un programa de nivel superior descompilado se ve así:

 [CompilerGenerated] internal static class $Program { private static void $Main(string[] args) { // top-level code here } }

Puede definir métodos normales en el nivel superior. Se compilan en la clase Program , pero fuera del método Main , donde también se pueden definir métodos de extensión.

Debido a que la clase Program generada es estática y no genérica, esperaría poder definir métodos de extensión en el nivel superior. Sin embargo, aparece el error del compilador CS1106: Extension method must be defined in a non-generic static class

Error del compilador de VS Code CS1106: el método de extensión debe definirse en una clase estática no genérica

¿Por qué es esto?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

La especificación del lenguaje C# dice:

Cuando el primer parámetro de un método incluye el modificador this , se dice que ese método es un método de extensión . Los métodos de extensión solo se pueden declarar en clases estáticas no genéricas y no anidadas.

Según la especificación del lenguaje, los métodos de extensión deben declararse en una clase estática.

No importa que los métodos de nivel superior se implementen colocándolos en una clase estática oculta. Los métodos de nivel superior (por definición) no están declarados en ninguna clase y, por lo tanto, no pueden ser métodos de extensión de acuerdo con la especificación.

Al igual que con todas las preguntas de diseño de idiomas, esta es la forma en que es así porque el equipo de diseño de idiomas diseñó el idioma. Presumiblemente, las mismas preocupaciones que le impiden definir métodos de extensión dentro de clases no estáticas también se aplican a los métodos de nivel superior.

Puede abrir una discusión en el repositorio de csharplang o hacer una pregunta en Gitter si desea que alguien con más autoridad brinde más detalles.

over 4 years ago · Santiago Trujillo Denunciar

0

La función de declaración de nivel superior se implementa de la forma en que la describió: su código de nivel superior está envuelto en la clase generada por el compilador y el método Main .

Su extensión no se puede declarar dentro de este método Main , por lo que su sintaxis no es válida. Una declaración de extensión no es una declaración de nivel superior.

over 4 years ago · Santiago Trujillo Denunciar

0

Usando SharpLab podemos ver que, sí, el Program generado es estático, y múltiples métodos declarados en un contexto de nivel superior se compilan correctamente (ejemplo aquí ), falta algo cuando se compara con los métodos de extensión: El atributo [Extension] , ya que ambos la clase y el método deben marcarse con esto, documentos oficiales aquí .

Este es el código generado por un Hello World de nivel superior (algunas cosas se omiten por brevedad, la cosa completa aquí )

 [assembly: Extension] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [CompilerGenerated] internal static class <Program>$ { private static void <Main>$(string[] args) { Console.WriteLine("Hello World"); } }

Ahora aquí está el código descompilado para una clase con un método de extensión:

 [Extension] internal static class Foo { [Extension] private static void WriteToConsole(string source) { Console.WriteLine(source); } }

Parece que el compilador no reconoce que existen métodos de extensión y, como tal, no lo está compilando correctamente. Tampoco podemos forzar el atributo Extension , ya que recibimos un error que dice que

error CS1112: no use 'System.Runtime.CompilerServices.ExtensionAttribute'. Use la palabra clave 'esto' en su lugar

E incluso si pudiéramos, no podemos colocarlo en la clase Program en sí.

TL;DR : el compilador de C# no reconoce que hay métodos de extensión en las declaraciones de nivel superior y, como tal, no aplica el atributo [Extension] necesario a la clase o al método

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda