Я пишу класс, который делает по существу тот же тип вычислений для каждого из примитивных числовых типов в С#. Хотя реальный расчет является более сложным, подумайте об этом как о методе вычисления среднего числа значений, например.
class Calc
{
public int Count { get; private set; }
public int Total { get; private set; }
public int Average { get { return Count / Total; } }
public int AddDataPoint(int data)
{
Total += data;
Count++;
}
}
Теперь, чтобы поддержать ту же операцию для double, float и, возможно, других классов, которые определяют operator + и operator/, моя первая мысль состояла в том, чтобы просто использовать generics:
class Calc<T>
{
public T Count { get; private set; }
public T Total { get; private set; }
public T Average { get { return Count / Total; } }
public T AddDataPoint(T data)
{
Total += data;
Count++;
}
}
К сожалению, С# не может определить, поддерживает ли T операторы + и /, поэтому не компилирует приведенный выше фрагмент. Моя следующая мысль заключалась в том, чтобы ограничить T типами, поддерживающими этих операторов, но мои первоначальные исследования показывают, что это невозможно.
Конечно, возможно установить каждый из типов, которые я хочу поддерживать в классе, который реализует собственный интерфейс, например. IMath и ограничить T, но этот код будет называться очень много раз, и я хочу избежать накладных расходов на бокс.
Есть ли элегантный и эффективный способ решить эту проблему без дублирования кода?