2010-06-17 68 views
8

当我看到这里Darins建议..LINQ扩展SelectMany in 3.5 vs 4.0?

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

process.getprocessesbyname()

..我有点好奇,我与.NET 3.5试图在VS2008 - 它没有编制,除非我改变到..

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

看了一些Darins答案之前,我怀疑这是我认为是问题,当我后来得到了我的手在VS2010 with.NET 4.0 - 预期 - 原建议的工作精美。

我的问题是:从3.5到4.0发生了什么使得这个(新语法)成为可能?扩展方法是否已被扩展(hmm)或lambda语法的新规则还是?

+0

当你试图编译它在.NET 3.5中,你得到了什么编译器错误? – Jacob 2010-06-17 17:25:48

+0

@Jacob - 好点:) 方法'System.Linq.Enumerable.SelectMany 的类型参数(System.Collections.Generic.IEnumerable ,System.Func >)'不能从使用中推断出来。尝试明确指定类型参数。 – Moberg 2010-06-17 17:30:37

+0

酷!发生这种事时我总是很烦恼。很高兴知道它已被修复:) +1 – leppie 2010-06-17 17:48:31

回答

7

看来,在C#的新版本(C#4.0与C#3.0 ...不是.NET的版本)中,委托选择更加智能。此想法在VS2008中可用,但它在解决问题时遇到了问题当有多个重载时使用哪个版本的方法。该方法是在编译时选择的,所以我必须相信,这与更新后的编译器相比,更多的是.NET版本。您可能会发现,您可以在VS2010中为.NET 2.0编译的解决方案使用新的重载功能。

例如,这部作品在VS2008

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

好的,非常感谢:) – Moberg 2010-06-17 18:50:35