在以下代码中:
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>.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));
}
并不喜欢我的定义。但是,仅仅是编译器的类型推断很弱并且无法弄清楚它吗?