为什么编译器无法推断方法的类型?

时间:2014-07-10 13:24:34

标签: c# linq ienumerable

在以下代码中:

public class A
{
    public decimal Decimal { get; set; }
}

public decimal Test()
{
    return new List<A>().Sum(SumDecimal);
}

public decimal SumDecimal(A a)
{
    return a.Decimal;
}

return new List<A>().Sum(SumDecimal);行有一个错误,指出SumDecimal是一个模糊的调用。

为什么编译器无法推断出SumDecimal的类型。但是,以下工作:

return new List<A>().Sum((Func<A, decimal>) SumDecimal);

当然,通常的lambda方式也适用:

return new List<A>().Sum(x => SumDecimal(x));

在更多实验中,如果我编写自己的扩展方法:

public static class MyExtensions
{
    public static T MySum<T, T2>(this IEnumerable<T2> ie, Func<T2, T> d)
    {
        return default(T);
    }
}

并调用它,编译器推断就好了:

return new List<A>().MySum(SumDecimal);

我发现IEnumerable<T>.Sumint等的decimal已超载:

public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
{
  return Enumerable.Sum(Enumerable.Select<TSource, int>(source, selector));
}

并不喜欢我的定义。但是,仅仅是编译器的类型推断很弱并且无法弄清楚它吗?

0 个答案:

没有答案