Código C # genérico e o operador Plus [duplicado]
Esta pergunta já tem uma resposta aqui:
Existe uma restrição que restringe meu método genérico a tipos numérico 20 respostasEstou escrevendo uma classe que faz essencialmente o mesmo tipo de cálculo para cada um dos tipos numéricos primitivos em C #. Embora o cálculo real seja mais complexo, pense nele como um método para calcular a média de um número de valores, por exemplo,
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++;
}
}
gora, para oferecer suporte à mesma operação para double, float e talvez outras classes que definem operador + e operator /, meu primeiro pensamento foi simplesmente usar genéricos:
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++;
}
}
Infelizmente, o C # não consegue determinar se T suporta operadores + e / portanto não compila o trecho acima. Meu próximo pensamento foi restringir T a tipos que suportam esses operadores, mas minha pesquisa inicial indica que isso não pode ser feit
Certamente é possível colocar em caixa cada um dos tipos que desejo oferecer suporte em uma classe que implementa uma interface personalizada, por exemplo. IMath e restrinja T a isso, mas esse código será chamado muitas vezes e eu quero evitar sobrecarga de boxe.
xiste uma maneira elegante e eficiente de resolver isso sem duplicação de códig