2010-06-17 4 views
8

Quand j'ai vu suggestion Darins ici ..Extension LINQ SelectMany en 3.5 vs 4.0?

IEnumerable<Process> processes = 
    new[] { "process1", "process2" } 
    .SelectMany(Process.GetProcessesByName); 

(process.getprocessesbyname())

.. J'étais un peu intriguée et je l'ai essayé dans VS2008 avec .NET 3.5 - et il n'a pas changé la compilation à moins que je à ..

IEnumerable<Process> res = 
    new string[] { "notepad", "firefox", "outlook" } 
    .SelectMany(s => Process.GetProcessesByName(s)); 

après avoir lu quelques réponses Darins avant que je doutais qu'il me était le problème était, et quand je suis arrivé plus tard, mes mains sur un VS2010 with.NET 4.0 - comme prévu - la suggestion d'origine a travaillé magnifiquement.

Ma question est: Qu'est-il arrivé de 3.5 à 4.0 qui rend cette (nouvelle syntaxe) possible? Est-ce que les extensionsmethods ont été étendues (hmm) ou de nouvelles règles pour la syntaxe lambda ou?

+0

Lorsque vous avez essayé de le compiler sous .NET 3.5, quelle erreur compilateur avez-vous obtenu? – Jacob

+0

@Jacob - bon point :) Les arguments de type pour la méthode 'System.Linq.Enumerable.SelectMany (System.Collections.Generic.IEnumerable , System.Func >) 'ne peut être déduit de l'utilisation. Essayez de spécifier explicitement les arguments de type. – Moberg

+0

Cool! J'étais toujours ennuyé quand cela arrivait. Bon à savoir il a été corrigé :) +1 – leppie

Répondre

7

Il semble que la sélection des délégués est beaucoup plus intelligente dans la nouvelle version de C# (C# 4.0 vs. C# 3.0 ... pas la version de .NET.) Cette idée était disponible dans VS2008, mais elle avait des problèmes pour résoudre quelle version de la méthode à utiliser quand il y avait plusieurs surcharges. La méthode est sélectionnée lors de la compilation, donc je dois croire que cela a plus à voir avec le compilateur mis à jour qu'avec la version de .NET. Vous trouverez probablement que vous pouvez utiliser la nouvelle capacité de surcharge avec des solutions compilées pour .NET 2.0 dans VS2010.

Par exemple, cela fonctionne dans VS2008

var ret = new[] { "Hello", "World", "!!!" }.Aggregate(Path.Combine); 
// this is the value of ret => Hello\World\!!! 
+0

Ok, merci beaucoup pour l'effort :) – Moberg