繁体   English   中英

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

[英]Multiple data type input in C# function

我正在从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数据类型。 是否可以修改函数以便可以使用多种数据类型?

使用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;
    }

通过使用泛型,您可以使用多种数据类型

T ConstrainValue(T值,T min,T max)其中T:IComparable

从v4.2开始,.net micro(netduino)不支持泛型

您将不得不使用另一种方案,例如将对象作为参数然后执行工作的函数。 然后,您必须在调用函数的返回值上使用“ 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));
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM