我正在从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
数据类型。是否可以修改函数以便可以使用多种数据类型?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
是的,你需要使它成为通用函数,类似的东西:
T ConstrainValue<T>(T value, T min, T max) where T : IComparable
我认为您需要添加更多接口
答案 2 :(得分:1)
通过指定struct
,您在调用方法时不会获得装箱,但是使用IComparable
时,您仍然会在调用CompareTo
时获得它,因为该接口方法需要{{1} }}
所以使用object
,我很确定现在没有拳击:
IComparable<T>
答案 3 :(得分:0)
通过使用泛型,您可以使用多种数据类型
T ConstrainValue(T值,T min,T max)其中T:IComparable
答案 4 :(得分:0)
.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));
}