Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

119
Visualizações
¿Hay alguna forma de detectar un cambio importante de C# 10 en la resolución de los métodos de extensión?

Considere el siguiente código:

 using System; static class Program { public static void Main() { Test test = new Test(); test.Method(()=>{}); } } public sealed class Test { public void Method(Delegate _) { Console.WriteLine("Test.Method(Delegate)"); } } public static class TestExt { public static void Method(this Test self, Action _) { Console.WriteLine("TestExt.Method(Action)"); } }

En C# 9.0 dirigido a net48 , esto genera TestExt.Method(Action)

En C# 10.0 dirigido a net6.0 , esto genera Test.Method(Delegate)

Obviamente, este es un cambio importante porque el método de extensión puede ejecutar un código diferente.

Mi pregunta es: ¿hay alguna manera de detectar este tipo de cambio importante en el código sin inspeccionar todo el código? Por ejemplo, ¿hay alguna regla de análisis de código que podamos habilitar para detectar este tipo de código?

Este cambio en realidad ha causado un error genuino en nuestra base de código.


Tenga en cuenta que esta diferencia de comportamiento solo se produce debido a cambios en la resolución del método de extensión. Si en lugar de un método de extensión, el método está en la propia clase Test , entonces ambas versiones de lenguaje llaman a Test.Method(Action) :

 static class Program { public static void Main() { Test test = new Test(); test.Method(()=>{}); } } public sealed class Test { public void Method(Delegate _) { Console.WriteLine("Test.Method(Delegate)"); // Not called by either version. } public void Method(Action _) { Console.WriteLine("TestExt.Method(Action)"); // Called by C#9 and C#10. } }

Información de contexto:

Este cambio radical nos ha mordido porque tenemos (con razón o sin ella) un método de extensión para Control.BeginInvoke() del siguiente modo (se omite el manejo de errores):

 public static void BeginInvoke(this Control control, Action action) { if (control.IsHandleCreated) tryBeginInvoke(control, action); }

Esto ya no se llama para código como:

 this.BeginInvoke(() => someMenu.Visible = somethingIsAvailable());

En su lugar, se llama a Control.BeginInvoke(Delegate) , que omite la verificación de control.IsHandleCreated y el método de manejo de errores tryBeginInvoke() .

over 4 years ago · Santiago Trujillo
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda