Ввод нескольких типов данных в функции C#

Я переключаюсь с Arduino (язык c) на Netduino (язык C#).

В моей программе Arduino у меня есть следующая функция (встроенная):

принуждать

Я хотел бы преобразовать это в C#. У меня есть следующий код:

int ConstrainValue(int value, int min, int max)
    {
        int Value = value;
        int Min = min;
        int Max = max;

        if (Value >= Max)
        {
            Value = Max;
            return Value;
        }
        else if (Value <= Max)
        {
            Value = Min;
            return Value;
        }
        return Value;
    }

Тем не менее, я также хотел бы иметь возможность использовать это для double тип данных. Можно ли изменить функцию, чтобы можно было использовать несколько типов данных?

5 ответов

Это, используя IComparable,

static T ConstrainValue<T>(T value, T min, T max) where T : IComparable
{
    if (value.CompareTo(max) > 0)
        return max;
    else if (value.CompareTo(min) < 0)
        return min;
    return value;
}

Да, вам нужно сделать его универсальной функцией, что-то вроде этого:

T ConstrainValue<T>(T value, T min, T max) where T : IComparable

Я думаю, что вам нужно добавить еще несколько интерфейсов, хотя

Указав struct, вы не получите бокс при вызове метода, но с помощью IComparable вы все равно получите его при звонке CompareTo потому что этот метод интерфейса принимает object,

Так что используйте IComparable<T> и я уверен, что сейчас нет бокса

    private static T ConstrainValue<T>(T value, T min, T max)
      where T : struct, IComparable<T>
    {
        if (value.CompareTo(max) > 0)
        {
            return max;
        }

        if (value.CompareTo(min) < 0)
        {
            return min;
        }

        return value;
    }

.net micro (netduino) НЕ поддерживает дженерики начиная с v4.2.

Вы должны будете использовать другую схему, такую ​​как функция, которая принимает объекты в качестве аргументов, а затем выполняет работу. Затем вам придется использовать 'as' или приведение к возвращению в вызывающей функции:

    object ConstrainValueInt(object value, object min, object max)
        {
   /* this could still get you in trouble with bool type */
          if (value.GetType().isValueType && min.GetType().isValueType && max.GetType().isValueType )
          return ( (value >= max)? max : ((value <= min)? min : value));
        }

Используя дженерики, вы можете использовать несколько типов данных

T ConstrainValue(значение T, T min, T max), где T: IComparable

Другие вопросы по тегам