Ввод нескольких типов данных в функции 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