Cri*_*scu 10 c# linq .net-4.0 .net-3.5
有这些基本定义
bool MyFunc(string input)
{
return false;
}
var strings = new[] {"aaa", "123"};
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这不会编译:
var b = strings.Select(MyFunc);
Run Code Online (Sandbox Code Playgroud)
但这会:
var c = strings.Select(elem => MyFunc(elem));
Run Code Online (Sandbox Code Playgroud)
该错误消息是"的类型参数方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)’不能从使用推断."
Resharper错误提示说它之间很困惑
Select(this IEnumerable<string>, Func<string, TResult>)
Run Code Online (Sandbox Code Playgroud)
和
Select(this IEnumerable<string>, Func<string, int, TResult>)
Run Code Online (Sandbox Code Playgroud)
...但MyFunc的签名是明确的 - 它只需要一个(字符串)参数.
谁能在这里解决一些问题?
Jon*_*eet 14
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
这与.NET 4中的C#编译器进行编译,但不是.NET 3.5中的编译器.
我认为将此称为错误修复是合理的,因为我认为这不是规范变更.
如果必须使用.NET 3.5中的编译器,则可以添加强制转换以阐明:
var results = strings.Select((Func<string,bool>) MyFunc);
Run Code Online (Sandbox Code Playgroud)
要么
var results = strings.Select(new Func<string,bool>(MyFunc));
Run Code Online (Sandbox Code Playgroud)
或者你可以使type参数显式:
var results = strings.Select<string, bool>(MyFunc);
Run Code Online (Sandbox Code Playgroud)
乔恩当然像往常一样正确.一些其他信息:
这是2007年的博客文章,我描述了你遇到的问题:
根据对该文章的反馈,我们决定解决这个问题,但出于调度原因无法修复C#3.
几个月后,我宣布修复将进入C#4,而不是进入C#3服务包: