C#函数中的多种数据类型输入

时间:2013-01-28 10:08:58

标签: c# .net arduino .net-micro-framework netduino

我正在从Arduino(c语言)切换到Netduino(c#语言)。

在我的arduino程序中,我有以下功能(内置):

Constrain

我想将其转换为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 个答案:

答案 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));
        }