无法应用运算符'<'到T和T类型的操作数

时间:2013-11-10 20:59:47

标签: c# .net generics

所以这是我的代码

public void BubbleSort<T>(T[] array) where T : IComparable<T>
{
    for (int i = 0; i < array.Length; i++)
    {
        for (int j = 1; j < array.Length; j++)
        {
            if (array[j] < array[j - 1])
            {

            }
        }
    }
}
在拍摄之前,请不要搜索。我已经搜索过,其中一个答案在SO上表示要使用一个可比较的界面来解决问题。

不幸的是,我不会因为这个错误而去任何地方。

4 个答案:

答案 0 :(得分:15)

看起来你期望IComparable<T>约束允许你使用不等式运算符。 IComparableIComparable<T>直接使用不等运算符说 nothing 。相反,他们所做的是提供一种CompareTo()方法,您可以使用模拟不等式运算符:

public void BubbleSort<T>(T[] array) where T: IComparable<T>
{
    for (int i = 0; i < array.Length; i++)
    {
        for (int j = 1; j < array.Length; j++)
        {
            if (array[j].CompareTo(array[j-1]) < 0)
            {

            }
        }
    }
}

答案 1 :(得分:9)

如果您无法添加通用约束,那么Comparer<T>

var comparer = Comparer<T>.Default;

非常有用。然后,您可以使用comparer.Compare(x,y)(并检查结果为负,零,正);这支持实现IComparable<T>IComparable的类型,包括对Nullable<T>包装器的“提升”支持 - 并且当类型支持{{{}时,将避免对结构和Nullable<T>情况进行装箱1}}。

答案 2 :(得分:5)

您不能在泛型类型上使用运算符。

相反,您需要使用CompareTo()中的IComparable<T>方法:

if (array[j].CompareTo(array[j - 1]) < 0)

小心null s。

答案 3 :(得分:3)

因此,您将T声明为IComparable,请使用其IComparable.CompareTo方法:

 if (array[j].CompareTo(array[j-1]) < 0)
 {

 }