lambda 表达式中的输入参数

Input parameters in lambda expressions

我有这个代码

public static double Average(this ParallelQuery<int> source) {
    return source.Aggregate(
       () => new double[2], 
       (acc, elem) => { acc[0] += elem; acc[1]++; return acc;},
       (acc1, acc2) => { acc1[0] += acc2[0]; acc1[1] += acc2[1]; return acc1; },
       acc => acc[0] / acc[1]);
}

它设置了一些带有2个参数的lambda表达式,但我的问题是程序如何知道acc是double的数组而elemsource的一个元素?没有作业

阅读 ParallelEnumerable.Aggregate 的文档。你用你的种子工厂定义 TAccumulate,所以类型是已知的。

编译器根据您的第一个参数推断类型。

因为方法签名是:

public static TResult Aggregate<TSource, TAccumulate, TResult>(
    this ParallelQuery<TSource> source,
    Func<TAccumulate> seedFactory,
    Func<TAccumulate, TSource, TAccumulate> updateAccumulatorFunc,
    Func<TAccumulate, TAccumulate, TAccumulate> combineAccumulatorsFunc,
    Func<TAccumulate, TResult> resultSelector
)

所以,TSource 已经知道是 int,一旦你将 () => new double[2] 作为 seedFactory 参数传递,它就知道 TAccumulatedouble[] 类型(因为 seedFactory 是 returns TAccumulate 的委托)。

同样,最后一个委托 (resultSelector) 的结果将定义结果类型。

如果您正在使用 Visual Studio 并将鼠标悬停在 source.Aggregate 上,intellisense 将向您显示通用参数是如何推断出来的。