В следующем коде:
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));
}
и не нравится, как я определил. Но все-таки, только то, что вывод типа компилятора является слабым, и он не может понять это?