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

man*_*lds 18 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

return new List<A>().Sum((Func<A, decimal>) SumDecimal);
Run Code Online (Sandbox Code Playgroud)

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

return new List<A>().Sum(x => SumDecimal(x));
Run Code Online (Sandbox Code Playgroud)

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

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

并称之为,编译器推断得很好:

return new List<A>().MySum(SumDecimal);
Run Code Online (Sandbox Code Playgroud)

我看到,IEnumerable<T>.Sum目前超载int,decimal等:

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

而不是像我定义的那样.但是,仅仅是编译器的类型推断很弱并且无法弄清楚吗?