2015-07-14 5 views
6

Envisagez l'exemple de code suivant.Différence dans l'évaluation de l'expression lambda statique du compilateur CSC et 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); 
    } 
} 

Si je compiler et exécuter ce code sous de débogage en utilisant Visual Studio 2010 (sous le compilateur CSC), il affichera le résultat suivant:

Method is not static. 
Value: 5 

Si je compilez le même code Visual studio 2010, mais cette fois en utilisant Release paramètres, la sortie suivante sera générée:

Method is static. 
Value: 5 

Maintenant, si nous devions exécuter le même code mais cette fois en utilisant Visual Studio 2015 CTP (sous le compilateur Roslyn), la sortie suivante est générée pour les de débogage et sortie paramètres:

Method is not static. 
Value: 5 

First , Je trouve curieux qu'il y ait une différence entre les versions Debug et Release de VS2010 (CSC). Pourquoi ne pas l'évaluer en tant que méthode statique sous débogage? En outre, il semble que dans certains cas, il évalue comme statique lorsqu'il est compilé dans Debug. J'ai une application de production qui obtient le résultat statique attendu sous Debug.

Deuxièmement, le compilateur Roslyn doit-il correspondre au comportement de CSC dans ce cas particulier?

+1

L'IL n'a pas de concept de lambdas. Les Lambdas sont compilés en type anonyme. Comme le montre la question liée, le compilateur peut générer des méthodes statiques si aucune fermeture n'est impliquée. Votre code ne doit pas dépendre d'un tel comportement, c'est strictement une question d'implémentation et d'optimisation du compilateur. –

+2

@PanagiotisKanavos Oui, je comprends pourquoi et suis d'accord avec vous que le code ne doit pas dépendre de ce comportement, c'est juste quelque chose que j'ai trouvé. J'étais curieux de la différence. Je ne suis pas d'accord que cette question était un doublon de la question liée. Ma question comprend que cela peut rendre les méthodes statiques si aucune fermeture n'existe. Ma question demandait essentiellement pourquoi le compilateur de Roslyn choisirait de ne pas le faire du tout. – deloreyk

+0

Voir https://roslyn.codeplex.com/workitem/246, qui explique pourquoi cette modification a été apportée. – SLaks

Répondre

11

Ceci a été un changement délibéré fait par l'équipe de Roslyn. Les délégués qui pointent vers des méthodes d'instance sont légèrement plus rapides à appeler, donc Roslyn compile maintenant lambdas à des méthodes d'instance même quand il n'en a pas besoin.

Voir discussion.