传递Func <tsource,tkey =“”> keySelector错误</tsource,>

时间:2010-05-11 15:32:15

标签: c# linq c#-3.0 delegates lambda

static void Main()
        {
string[] a = { "a", "asd", "bdfsd", "we" };
            a = a.OrderBy(fun).ToArray();
}

 private static int fun(string s)
        {
            return s.Length;
        }

它给出了编译时错误。我知道我们可以像这样使用Lambda表达式。 a.OrderBy(s=>s.Length).ToArray();但我希望通过定义不同的功能来做到这一点。我做错了什么?

3 个答案:

答案 0 :(得分:6)

表达式fun是一个名为方法组的无类型表达式 由于方法组没有类型,因此编译器无法推断通用OrderBy方法的类型参数。

您需要显式传递类型参数,如下所示:

a = a.OrderBy<string, int>(fun).ToArray();

或者,

a = a.OrderBy(new Func<string, int>(fun)).ToArray();

答案 1 :(得分:4)

SLaks是正确的,因为C#3编译器不允许这样做,但重要的是指出the C# 4 compiler will compile your example without issue.

答案 2 :(得分:3)

发生了什么事。当我第一次实现C#3的方法类型推理算法时,我推断SLaks建议:方法组没有类型,在C#2中没有任何推断,并且重载解析需要通过知道类型从方法组中选择方法这些论点正是我们试图推断的;这是鸡和蛋的问题。我在2007年11月的博客中写道:

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

我们决定重新审视这个问题并改变类型推断算法,以便我们从方法组中做出推断,如果已经做了足够的推论,可以在方法组上进行重载解析。

不幸的是,这个变化在周期中来得太晚了,并没有进入C#3。我们将它推迟到C#4,你就去了。

我在2008年写了博客:

http://blogs.msdn.com/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx