Как я могу написать один класс для многократной компиляции с разными числовыми типами?

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

Очевидно, что в моем примере я могу просто написать код дважды. Однако я хотел бы использовать этот процесс для создания больших сложных структур данных с целочисленной версией и версией с плавающей запятой, поэтому не хочу возможности ошибок копирования-вставки при обновлении моей структуры. Я также не хочу, чтобы потеря скорости заключалась в заключении структуры с плавающей запятой в интегральную оболочку и ненужном преобразовании всех входных данных в более мягкий тип данных.

5
задан dlras2 1 July 2011 в 16:05
поделиться