Piszę klasę, która wykonuje zasadniczo ten sam typ obliczenia dla każdego z podstawowych typów liczbowych w języku C#. Chociaż rzeczywiste obliczenia są bardziej złożone, należy je traktować jako metodę obliczania średniej z wielu wartości, np.Ogólny kod C# i operator Plus
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++;
}
}
Teraz wspierać tę samą operację dla podwójnym, pływaka i być może innych klas, które określają operatora + i operatora /, moja pierwsza myśl była po prostu użyć rodzajowych:
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++;
}
}
Niestety C# jest w stanie ustal, czy T obsługuje operatorów + i/lub nie kompiluje powyższego fragmentu. Następną myślą było ograniczenie T do typów, które wspierają tych operatorów, ale moje wstępne badania wskazują, że nie można tego zrobić.
Z pewnością możliwe jest umieszczenie każdego z typów, które chcę obsłużyć w klasie implementującej niestandardowy interfejs, np. IMath i ogranicz T do tego, ale ten kod będzie się nazywał wielką liczbę razy i chcę uniknąć narzutów boksu.
Czy istnieje elegancki i skuteczny sposób rozwiązania tego problemu bez duplikowania kodu?
Nie możesz po prostu użyć LINQ? Suma i średnia są obsługiwane w IEnumerable. – Mathias
Sprawdź to inne pytanie ogólne: http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers – spinon
@Mathias: Nie, użyłem tego jako uproszczonego przykładu rzeczywistych obliczeń. –