【问题标题】:Simple Linq expression won't compile简单的 Linq 表达式不会编译
【发布时间】:2025-12-09 21:25:01
【问题描述】:

有这些基本定义

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<string>, Func<string, TResult>)

Select(this IEnumerable<string>, Func<string, int, TResult>)

...但是 MyFunc 的签名很清楚 - 它只需要一个(字符串)参数。

任何人都可以在这里解释一下吗?

【问题讨论】:

    标签: c# linq .net-3.5 .net-4.0


    【解决方案1】:

    在 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<string,bool>) MyFunc);
    

    var results = strings.Select(new Func<string,bool>(MyFunc));
    

    或者你可以明确类型参数:

    var results = strings.Select<string, bool>(MyFunc);
    

    【讨论】:

    • 所以我认为编译器会解决问题并不是不合理...
    • @Cristi:不......虽然试图从规范中准确辨别它应该如何工作是很棘手的。我认为规范的类型推断部分写满了“Here be dragons”。
    • 我们决定改变行为,因为事实证明为时已晚,无法将更改导入 C# 3,因此我们将其放在 C# 4 中。
    • (Mads 和我可能会再次重写类型推断规范,因为现在它在命名/可选参数方面是不正确的。我们将尽量让它更容易理解。)
    • @Eric:如果您有兴趣让 beta 测试人员阅读新规范,我相信您知道我很乐意提供帮助 :)
    【解决方案2】:

    Jon 当然像往常一样是正确的。一些附加信息:

    这是 2007 年的博客文章,我在其中描述了您遇到的问题:

    http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-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-inference-changes-part-zero.aspx

    【讨论】: