Использование универсального функции в виде параметра

StackOverflow https://stackoverflow.com/questions/3431569

  •  26-09-2019
  •  | 
  •  

Вопрос

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

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

Я получаю эту ошибку:

Ошибка 2 аргументы типа для метода «System.linq.enumerable.ru). Попробуйте уточнить аргументы типа явно.

Как я могу это исправить?

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Calculate(team, calcFunc);

Вам придется написать:

Calculate<MyClass>(team, calcFunc);

Тем не менее, вы действительно должны знать, что возвращается CalculatorSefunc --- я собираюсь предположить, что все из них, которые вы используете, возвращают тот же тип значения (будь то десятичный или INT на Float). В каком случае вы можете определить его как:

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

Тогда у вас нет дженериков в декларации вообще беспокоиться о.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top