Я пытаюсь написать классы, которые обрабатывают разные типы чисел. Я знаю, что 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
, однако. Есть ли более элегантное решение для этого?
Очевидно, в моем примере я могу просто написать код дважды. Однако я хотел бы использовать этот процесс для создания больших сложных структур данных с целочисленной версией и версией с плавающей запятой, поэтому я не хочу возможности ошибок копирования-вставки при обновлении моей структуры. Также я не хочу потерю скорости из-за оборачивания структуры с плавающей запятой в целочисленную оболочку и излишнего преобразования всех входных данных в более мягкий тип данных.