Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.1K
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!