簡體   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