仅对lambda表达式的隐式类型推断?为什么?困惑!

Pre*_*ets 4 .net c# lambda .net-3.5

我有以下示例代码(仅用于C#3.5学习目的!).

我正在调用接受IEnumerable和sort函数的Sort函数.如果我使用lambda表达式调用它(案例A),编译器可以派生返回类型TResult,但是当我传递func SortInt(案例B)时,编译器会抛出错误!

我无法理解为什么编译器在第二种情况下无法派生TResult!我似乎传递了完全相同的信息.或者这不准确?

请帮忙 !

int[] intArray = { 1, 3, 2, 5, 1 };

IEnumerable<int> intArray2 = Sort(intArray, x => SortInt(x)); // <= CASE A - OK !

IEnumerable<int> nextIntArray = Sort(intArray, SortInt); // <= CASE B - Compile Error: Cannot Infer Type !

public static IEnumerable<TResult> Sort<T, TResult>(IEnumerable<T> toBeSorted,    
                              Func<IEnumerable<T>, IEnumerable<TResult>> sortFunc)
{
    return sortFunc(toBeSorted);
}

public static IEnumerable<int> SortInt(IEnumerable<int> array)
{
    return array.OrderByDescending(x => x);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

我同意类型推断不适用于方法组转换很烦人.我希望C#编译器在组中只有一个适用方法的常见情况下更聪明.但是,在复杂的情况下,最终会出现多个适用的重载,从而导致推断出不同的类型.

选项:

  • 正如您所示,从lambda表达式中调用该方法
  • 明确指定类型参数,而不是依赖于推理
  • 将方法组强制转换为涉及的特定类型(比第二个选项更差)
  • 使用单独的局部变量并明确指定其类型

基本上我会坚持使用前两个选项中的任何一个,因为它们都很烦人.请注意,第一个选项会有轻微的性能损失,因为它是一个额外的间接级别,但通常不会很重要.


Rob*_*les 6

看起来好像第二个示例中的推理失败,因为编译器无法对SortInt执行重载解析.

这可能是一个更全面的解释:

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