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)
而不是像我定义的那样.但是,仅仅是编译器的类型推断很弱并且无法弄清楚吗?