2010-06-17 8 views
8

Cuando vi Darins sugerencia aquí ..Extensión LINQ SelectMany en 3.5 vs 4.0?

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

(process.getprocessesbyname())

.. Yo estaba un poco intrigado y Lo he probado en VS2008 con .NET 3.5 - y no me he cambiado a menos que la compilación a ..

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

después de haber leído algunas respuestas Darins antes de que yo sospechaba que era yo que era el problema, y ​​cuando más tarde llegó a mis manos en un VS2010 with.NET 4.0 - como se esperaba - la sugerencia original trabajó hermosamente.

Mi pregunta es: ¿Qué ha pasado de 3.5 a 4.0 que hace posible esta (nueva sintaxis)? ¿Son los métodos de extensión los que se han extendido (hmm) o las nuevas reglas para la sintaxis lambda o?

+0

Cuando se trató de compilar bajo .NET 3.5, lo error del compilador obtuvo? – Jacob

+0

@Jacob - buen punto :) Los argumentos de tipo para el método 'System.Linq.Enumerable.SelectMany (System.Collections.Generic.IEnumerable , System.Func >) 'no se puede deducir del uso. Intente especificar los argumentos de tipo explícitamente. – Moberg

+0

¡Genial! Siempre me molestaba cuando sucedía esto. Es bueno saber que se ha solucionado :) +1 – leppie

Respuesta

7

Parece que la selección de delegados es mucho más inteligente en la nueva versión de C# (C# 4.0 vs. C# 3.0 ... no la versión de .NET). Esta idea estaba disponible en VS2008, pero tenía problemas resolviendo qué versión del método usar cuando hubo sobrecargas múltiples. El método se selecciona en la compilación, así que tengo que creer que esto tiene más que ver con el compilador actualizado que con la versión de .NET. Probablemente descubrirá que puede usar la nueva capacidad de sobrecarga con las soluciones compiladas para .NET 2.0 en VS2010.

Por ejemplo, esto funciona en VS2008

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

Ok, muchas gracias por el esfuerzo :) – Moberg

Cuestiones relacionadas