Подтвердить что ты не робот

Почему компилятор не может определить тип метода?

В следующем коде:

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);

И, конечно же, обычный лямбда-способ тоже работает:

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>.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));
}

и не нравится, как я определил. Но все-таки, только то, что вывод типа компилятора является слабым, и он не может понять это?

4b9b3361