Использование Generic с Func в качестве параметра - PullRequest
0 голосов
/ 07 августа 2010

Мой код просто:

  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 ]

1 голос
/ 07 августа 2010

Вы не можете - по крайней мере, в текущей форме. Перегрузка Average не доступна для полностью универсальных значений (т. Е. Для всех типов C, как вы указали).

Списки средних потребностей чисел (int, double, float ...) или функция преобразования, которая производит числа. В текущей форме вы могли бы вызвать Calculator<string>, и было бы абсолютно бессмысленно вычислять среднее значение для строк.

Вам просто нужно ограничить метод определенным числовым типом (или обеспечить перегрузки), но универсальные шаблоны просто не будут работать.

1 голос
/ 07 августа 2010

Метод Enumerable.Average не имеет перегрузки, которая работает с универсальным типом. Вы пытаетесь позвонить Average<TSource>(IEnumerable<TSource>, Func<TSource, C>), который не существует.

Чтобы использовать среднее, вам нужно указать один из реально существующих типов (для C), например double, decimal и т. Д.

0 голосов
/ 07 августа 2010

Вместо записи:

Calculate(team, calcFunc);

Вам нужно будет написать:

Calculate<MyClass>(team, calcFunc);

Однако вы действительно должны знать, что возвращает calculatorFunc --- Я собираюсь предположитьчто все те, которые вы используете, возвращают один и тот же тип значения (будь то десятичное или целое число типа float).В этом случае вы можете определить его следующим образом:

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

Тогда в объявлении вообще нет обобщений.

...