c#:Func <t>参数中的重载决策

时间:2015-04-24 13:12:23

标签: c# generics overloading overload-resolution

编写此功能:

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

但是我收到了编译错误:

  

错误1方法的类型参数   &#39; System.Linq.ParallelEnumerable.Aggregate(System.Linq.ParallelQuery<TSource>,   TAccumulateSystem.Func<TAccumulate,TSource,TAccumulate>,   System.Func<TAccumulate,TAccumulate,TAccumulate>,   System.Func<TAccumulate,TResult>)&#39;       无法从使用中推断出来。尝试明确指定类型参数。

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

我该如何帮助它?

1 个答案:

答案 0 :(得分:5)

问题是你的第三个参数 - 方法声明中的第四个参数。这被宣布为:

// 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,否则它无效。

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