简单的Linq表达式将无法编译

有这些基本定义

bool MyFunc(string input) { return false; } var strings = new[] {"aaa", "123"}; 

我想知道为什么这不会编译:

 var b = strings.Select(MyFunc); 

但这会:

 var c = strings.Select(elem => MyFunc(elem)); 

错误消息是“方法的类型参数’System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)’无法从用法中推断出来。”

Resharper错误提示说它之间很困惑

 Select(this IEnumerable, Func) 

 Select(this IEnumerable, Func) 

…但MyFunc的签名是明确的 – 它只需要一个(字符串)参数。

谁能在这里解决一些问题?

在C#3和C#4编译器之间,通用类型推断在实现方面略有改变。 这是一个简短但完整的示例程序:

 using System; using System.Linq; class Test { static void Main() { string[] strings = { "a", "b" }; var results = strings.Select(MyFunc); } static bool MyFunc(string input) { return true; } } 

这与.NET 4中的C#编译器进行编译,但不是.NET 3.5中的编译器。

认为将其称为错误修复是合理的,因为我认为这不是规范变更。

如果必须使用.NET 3.5中的编译器,则可以添加强制转换以阐明:

 var results = strings.Select((Func) MyFunc); 

要么

 var results = strings.Select(new Func(MyFunc)); 

或者你可以使type参数显式:

 var results = strings.Select(MyFunc); 

乔恩当然像往常一样正确。 一些其他信息:

这是2007年的博客文章,我描述了你遇到的问题:

http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-in​​ference-does-not-work-on-member-groups.aspx

根据对该文章的反馈,我们决定解决这个问题,但出于调度原因无法修复C#3。

几个月后,我宣布修复将进入C#4,而不是进入C#3服务包:

http://blogs.msdn.com/b/ericlippert/archive/2008/05/28/method-type-in​​ference-changes-part-zero.aspx