使用Generic和Func作为参数

时间:2010-08-07 18:33:48

标签: linq generics func

我的代码很简单:

  public override C Calculator<C>(Team[] teams, Func<Team, C> calculatorFunc)
    {
        return teams.Average(calculatorFunc);
    }     

我收到此错误:

错误2无法从用法推断出方法'System.Linq.Enumerable.Average(System.Collections.Generic.IEnumerable,System.Func)'的类型参数。尝试显式指定类型参数。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

你不能 - 至少在目前的形式。没有Average重载可用于完全通用值(即,如您指定的所有类型C)。

平均需要的数字列表(intdoublefloat ...)或产生数字的转化函数。在当前表单中,您可以调用Calculator<string>,计算字符串的平均值绝对没有意义。

您只需将方法限制为特定的数字类型(或提供重载),但泛型根本不起作用。

答案 1 :(得分:1)

Enumerable.Average方法没有适用于泛型类型的重载。您正在尝试拨打不存在的Average<TSource>(IEnumerable<TSource>, Func<TSource, C>)

为了使用平均值,您需要指定实际存在的其中一种类型(对于C),例如doubledecimal等。

答案 2 :(得分:0)

而不是写作:

Calculate(team, calcFunc);

你必须写:

Calculate<MyClass>(team, calcFunc);

但是,你真的应该知道calculatorFunc正在返回什么---我将假设你使用的所有值都返回相同的值类型(无论是十进制还是浮点数)。在这种情况下,您可以将其定义为:

public override int Calculator(Team[] teams, Func<Team, int> calculatorFunc)
{
    return teams.Average(calculatorFunc);
}

然后你在声明中根本没有任何泛型来担心。