2015-07-14 12 views
6

Si consideri il seguente codice di esempio.Differenza nella valutazione delle espressioni lambda statiche del compilatore CSC e Roslyn?

class Program 
{ 
    static void Main(string[] args) 
    { 
     DoSomethingWithAction(i => 
      { 
       Console.WriteLine("Value: {0}", i); 
      }); 

     Console.ReadLine(); 
    } 

    private static void DoSomethingWithAction(Action<int> something) 
    { 
     Console.WriteLine(something.Target == null 
      ? "Method is static." 
      : "Method is not static."); 

     something(5); 
    } 
} 

Se compilo ed eseguire questo codice sotto debug utilizzando il Visual Studio 2010 (sotto CSC compilatore) si stamperà il seguente risultato:

Method is not static. 
Value: 5 

Se compilo lo stesso codice in visual Studio 2010, ma questa volta usando Stampa impostazioni, il seguente output verrà generato:

Method is static. 
Value: 5 

Ora, se dovessimo eseguire lo stesso codice, ma questa volta utilizzando Visual Studio 2015 CTP (sotto il compilatore Roslyn), il seguente output viene generato per entrambi debug e uscita impostazioni:

Method is not static. 
Value: 5 

First , Trovo curioso che ci sia una differenza tra le versioni di debug e release di VS2010 (CSC). Perché non dovrebbe valutare come metodo statico sotto debug? Inoltre, sembra che in alcuni casi esso valuti come statico quando compilato in Debug. Ho un'applicazione di produzione che sta ottenendo il risultato statico previsto in Debug.

In secondo luogo, il compilatore di Roslyn deve corrispondere al comportamento di CSC in questo caso particolare?

+1

L'IL non ha alcun concetto di lambda. Lambdas sono compilati in modo anonimo. Come mostra la domanda collegata, il compilatore può generare metodi statici se non sono coinvolte chiusure. Il tuo codice non dovrebbe dipendere da un simile comportamento, ma è strettamente una questione di implementazione e ottimizzazione del compilatore –

+2

@PanagiotisKanavos Sì, ho capito perché e sono d'accordo con te sul fatto che il codice non dovrebbe dipendere da quel comportamento, è solo qualcosa che ho trovato e Ero curioso della differenza. Non sono d'accordo sul fatto che questa domanda fosse un duplicato della domanda collegata. La mia domanda comprende che potrebbe rendere statici i metodi se non esistono chiusure. La mia domanda stava essenzialmente chiedendo perché il compilatore di Roslyn avrebbe scelto di non farlo affatto. – deloreyk

+0

Vedere https://roslyn.codeplex.com/workitem/246, che spiega perché è stata apportata questa modifica. – SLaks

risposta

11

Questo è stato un cambiamento intenzionale apportato dal team di Roslyn.

I delegati che puntano a metodi di istanza sono leggermente più veloci da richiamare, quindi Roslyn ora compila lambdas sui metodi di istanza anche quando non è necessario.

Vedere discussion.

Problemi correlati