【问题标题】:Using Generic with Func as a parameter使用带有 Func 的 Generic 作为参数
【发布时间】:2010-08-08 02:42:22
【问题描述】:

我的代码很简单:

  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)”的类型参数。尝试明确指定类型参数。

我该如何解决这个问题?

【问题讨论】:

    标签: linq generics func


    【解决方案1】:

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

    Average 需要数字列表(intdoublefloat ...)或生成数字的转换函数。在当前的形式中,您可以调用 Calculator&lt;string&gt;,而计算字符串的平均值绝对没有意义。

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

    【讨论】:

      【解决方案2】:

      Enumerable.Average 方法没有适用于泛型类型的重载。您正在尝试调用不存在的Average&lt;TSource&gt;(IEnumerable&lt;TSource&gt;, Func&lt;TSource, C&gt;)

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

      【讨论】:

        【解决方案3】:

        而不是写:

        Calculate(team, calcFunc);
        

        你必须写:

        Calculate<MyClass>(team, calcFunc);
        

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

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

        那么你在声明中根本不需要担心泛型。

        【讨论】:

        • 没有。这是关于方法定义的,调用它没有问题。
        • “计算”是什么意思? (它的计算器……)你能把需要写的整个方法写出来吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多