c# 中的重载解析:Func<T> 参数

overload resolution in c#: Func<T> parameter

编写此函数:

static TResult reduce<TSource, TResult>(ParallelQuery<TSource> source,
                                        Func<TResult> seedFactory,
                                        Func<TResult, TSource, TResult> aggregator) {
    return source.Aggregate(seedFactory, aggregator, aggregator, x => x);
}                

但是我得到一个编译错误:

Error 1 The type arguments for method 'System.Linq.ParallelEnumerable.Aggregate(System.Linq.ParallelQuery<TSource>, TAccumulate, System.Func<TAccumulate,TSource,TAccumulate>, System.Func<TAccumulate,TAccumulate,TAccumulate>, System.Func<TAccumulate,TResult>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

我想使用的重载是this one 虽然编译器似乎认为它也可以是 this one

我该如何帮助它?

问题是您的第三个参数 - 方法声明中的第四个参数。声明为:

// Note: type parameter names as per Aggregate declaration
Func<TAccumulate, TAccumulate, TAccumulate> combineAccumulatorsFunc

但是你正试图传递一个

// Note: type parameter names as per reduce declaration
Func<TResult, TSource, TResult> aggregator

除非编译器知道 TResult 可转换为 TSource,否则这是无效的。

基本上,您的方法只需要一个聚合函数——如何将到目前为止的累加器与另一个源值组合起来以创建另一个累加器。您要调用的方法需要另一个函数,它将两个累加器组合在一起以创建另一个累加器。我认为您将 在您的方法中采用另一个参数来使其工作。