我的代码很简单:
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)'的类型参数。尝试显式指定类型参数。
我该如何解决这个问题?
答案 0 :(得分:1)
你不能 - 至少在目前的形式。没有Average
重载可用于完全通用值(即,如您指定的所有类型C
)。
平均需要的数字列表(int
,double
,float
...)或产生数字的转化函数。在当前表单中,您可以调用Calculator<string>
,计算字符串的平均值绝对没有意义。
您只需将方法限制为特定的数字类型(或提供重载),但泛型根本不起作用。
答案 1 :(得分:1)
Enumerable.Average方法没有适用于泛型类型的重载。您正在尝试拨打不存在的Average<TSource>(IEnumerable<TSource>, Func<TSource, C>)
。
为了使用平均值,您需要指定实际存在的其中一种类型(对于C),例如double
,decimal
等。
答案 2 :(得分:0)
而不是写作:
Calculate(team, calcFunc);
你必须写:
Calculate<MyClass>(team, calcFunc);
但是,你真的应该知道calculatorFunc正在返回什么---我将假设你使用的所有值都返回相同的值类型(无论是十进制还是浮点数)。在这种情况下,您可以将其定义为:
public override int Calculator(Team[] teams, Func<Team, int> calculatorFunc)
{
return teams.Average(calculatorFunc);
}
然后你在声明中根本没有任何泛型来担心。