C# 如何将此简单方法转换为泛型方法?

C# 如何将此简单方法转换为泛型方法?,c#,.net,generics,comparison-operators,C#,.net,Generics,Comparison Operators,我有一个方法如下: int coerce(int val, int min=0, int max = 10) { if (val < min) return min; if (val > max) return max; return val; } 我知道代码没有运行,这就是为什么我要这样做。我现在被两个问题弄糊涂了: 如何比较T类型 Visual Studio警告操作员。我尝试使用where T:IComparable,但它

我有一个方法如下:

int coerce(int val, int min=0, int max = 10)
{
    if (val < min)
        return min;
    if (val > max)
        return max;
    return val;
}
我知道代码没有运行,这就是为什么我要这样做。我现在被两个问题弄糊涂了:

  • 如何比较
    T
    类型

    Visual Studio警告操作员
    。我尝试使用
    where T:IComparable
    ,但它并没有解决我的问题


  • 如何为泛型参数设置默认值

    我试着用
    (T)0
    (T)10
    来实现它。但无论如何,这不是一个好的选择

  • 这可能是一个简单的问题,但我在谷歌上找不到答案。

    你应该使用method而不是
    操作符。并应用正确的泛型约束,对于数值类型,它应该是
    IComparable、IComparable、IConvertible、IEquatable、IFormattable
    。但是,您只能在
    中保留T:struct,IComparable
    ,这对于您的目的应该足够了(但是
    struct
    在这里很重要,因为您正在比较值类型)

    T强制(T val,T min,T max),其中T:struct,IComparable,IComparable,IConvertible,IEquatable,IFormattable
    {
    如果(值比较到(最小值)<0)
    返回最小值;
    如果(值比较到(最大值)>0)
    返回最大值;
    返回val;
    }
    
    您还可以指定默认的
    min
    值,如
    T min=default(T)
    ,但不能为
    max
    值指定

    在注释之后,如果对
    min
    max
    值使用
    Nullable
    ,则代码可以如下编写

    T强制(T val,T?min=default,T?max=default),其中T:struct,IComparable
    {
    var minValue=min.HasValue?min.Value:默认值(T);
    var maxValue=max.HasValue?max.Value:(T)Convert.ChangeType(10,typeof(T));
    如果(值比较到(最小值)<0)
    返回最小值;
    如果(值比较到(最小值)>0)
    返回最大值;
    返回val;
    }
    
    您应该使用方法而不是
    运算符。并应用正确的泛型约束,对于数值类型,它应该是
    IComparable、IComparable、IConvertible、IEquatable、IFormattable
    。但是,您只能在
    中保留T:struct,IComparable
    ,这对于您的目的应该足够了(但是
    struct
    在这里很重要,因为您正在比较值类型)

    T强制(T val,T min,T max),其中T:struct,IComparable,IComparable,IConvertible,IEquatable,IFormattable
    {
    如果(值比较到(最小值)<0)
    返回最小值;
    如果(值比较到(最大值)>0)
    返回最大值;
    返回val;
    }
    
    您还可以指定默认的
    min
    值,如
    T min=default(T)
    ,但不能为
    max
    值指定

    在注释之后,如果对
    min
    max
    值使用
    Nullable
    ,则代码可以如下编写

    T强制(T val,T?min=default,T?max=default),其中T:struct,IComparable
    {
    var minValue=min.HasValue?min.Value:默认值(T);
    var maxValue=max.HasValue?max.Value:(T)Convert.ChangeType(10,typeof(T));
    如果(值比较到(最小值)<0)
    返回最小值;
    如果(值比较到(最小值)>0)
    返回最大值;
    返回val;
    }
    
    公共最大温度(T val,T min,T Max),其中T:i可比较
    {
    如果(值比较到(最小值)=-1)
    返回最小值;
    如果(值比较到(最小值)=1)
    返回最大值;
    返回val;
    }
    

    公共最大温度(T val,T min,T Max),其中T:i可比较
    {
    如果(值比较到(最小值)=-1)
    返回最小值;
    如果(值比较到(最小值)=1)
    返回最大值;
    返回val;
    }
    

    诀窍在于使用IComparable方法,而不是比较运算符。在这种情况下,方法

    参数的默认值并不容易,您可以假设数值并进行直接转换,但T可以是任何IComparable数据类型

    public static T Coerce<T>(T val, T min, T max) where T:IComparable {
        if (val.CompareTo(min) < 0)
            return min;
        else if (val.CompareTo(max) > 0)
            return max;
        else
            return val;
    }
    
    公共静态T强制(T val,T min,T max),其中T:i可比较{
    如果(值比较到(最小值)<0)
    返回最小值;
    如果(值比较到(最大值)>0,则为其他值
    返回最大值;
    其他的
    返回val;
    }
    

    Fiddle:

    诀窍在于使用IComparable方法,而不是比较运算符。在这种情况下,方法

    参数的默认值并不容易,您可以假设数值并进行直接转换,但T可以是任何IComparable数据类型

    public static T Coerce<T>(T val, T min, T max) where T:IComparable {
        if (val.CompareTo(min) < 0)
            return min;
        else if (val.CompareTo(max) > 0)
            return max;
        else
            return val;
    }
    
    公共静态T强制(T val,T min,T max),其中T:i可比较{
    如果(值比较到(最小值)<0)
    返回最小值;
    如果(值比较到(最大值)>0,则为其他值
    返回最大值;
    其他的
    返回val;
    }
    

    Fiddle:

    您是否查看了msdn示例
    IComparable
    定义了
    CompareTo
    ,而不是比较运算符。因此,您需要使用
    val.CompareTo(min)=-1,而不是
    val
    。。。您不能在泛型实现中使用
    int
    默认值,最好是
    int min=default
    ,但在我看来,您不应该尝试在此方法中实现默认值。我如何为泛型类型参数设置默认值您可以使用
    Default(T)
    将其设置为数据类型的默认值。在您的例子中,整数为0。我认为,对于这个方法来说,不是
    强制()。考虑到这一点,许多答案都提供了一个通用的实现
    IComparable
    定义了
    CompareTo
    ,而不是比较运算符。因此,您需要使用
    val.CompareTo(min)=-1,而不是
    val
    。。。您不能使用
    int
    默认值来实现通用实现,最好是
    int min=default
    ,但在我看来,您不应该尝试实现d