Я пытаюсь написать классы, которые обрабатывают разные типы чисел. Я знаю, что C # (и, как мне кажется, .Net в целом) не имеет интерфейса INumber
, поэтому я не могу использовать что-то вроде следующего:
public class Adder<T> where T:INumber
{
public T Add(T a, T b)
{
return a + b;
}
}
Это нормально, потому что я бы хотел избежать бокс / распаковка каждого из моих номеров. Однако я мог бы использовать условную компиляцию для каждого типа, который я хочу поддерживать:
#if FLOAT
public class AdderF
{
public float Add(float a, float b)
#else
public class Adder
{
public int Add(int a, int b)
#endif
{
return a + b;
}
}
Это означает, что мне нужно будет скомпилировать другой Library.dll
и LibraryF.dll
, однако . Есть ли более элегантное решение этой проблемы?
Очевидно, что в моем примере я могу просто написать код дважды. Однако я хотел бы использовать этот процесс для создания больших сложных структур данных с целочисленной версией и версией с плавающей запятой, поэтому не хочу возможности ошибок копирования-вставки при обновлении моей структуры. Я также не хочу, чтобы потеря скорости заключалась в заключении структуры с плавающей запятой в интегральную оболочку и ненужном преобразовании всех входных данных в более мягкий тип данных.