痛苦的泛型,运算符'> ='不能应用于'T'和'T'类型的操作数

时间:2012-01-25 10:43:02

标签: c# generics

这是我的代码:

class BinaryTree<T> 
{
    private node<T> Head;
    public class node<T> 
    {
     public T Data;
     public node<T> right;
     public node<T> left;
     public node<T> parent;
    ...
    }
    ...
    private void insert(ref T data, node<T> parent, ref node<T> currentChild) 
    {
    ...
        {
            if (currentChild.Data >= data) insert(ref data, currentChild, ref currentChild.right);
            else insert(ref data, currentChild, ref currentChild.left);
        }
     }
}

if (currentChild.Data >= data)上方我收到错误:

  

运算符'&gt; ='无法应用于'T'和'T'类型的操作数

如何解决错误?

6 个答案:

答案 0 :(得分:11)

您需要指定T实​​现IComparable,以便您可以比较:

class BinaryTree<T> where T : IComparable<T>
{
    ...
    public class node<T> where T : IComparable<T> ...
    ...
    if (currentChild.Data.CompareTo(data) >= 0) ...
    ...
}

答案 1 :(得分:8)

此问题的经典解决方案是:(1)制作T IComparable<T>,或(2)将IComparer<T>或仿函数用于您的课程。

(1)

class BinaryTree<T> where T : Comparable<T> ...

(2)

class BinaryTree<T> {
    private node<T> Head;
    private readonly IComparer<T> comparer;
    public BinaryTree(IComparer<T> comparer) {
        this.comparer = comparer;
    }
    //...
}

答案 2 :(得分:1)

我不知道C#,但是在Java中你需要有一个通用Comparator类的实例,用你想要比较的类型进行参数化。这个泛型类提供了一个compareTo()函数,它将以允许比较两种类型的方式实现。

答案 3 :(得分:1)

T应该是一个实现IComparable的类型,然后使用它的compareto方法而不是&gt; =。如果您仍想支持&gt; =。

,则运算符重载是另一种选择

答案 4 :(得分:1)

虽然有些人建议使用IComparable,但我建议使用IComparer<T>,而应将其存储在树的字段中。树的一个构造函数应该接受IComparer<T>,它应该存储在您的字段中。另一个应该将IComparer<T>字段设置为Comparer<T>.InvariantDefault()。因此,树的消费者将能够选择树中的事物的排序方式。请注意,如果在构建类时提供IComparer<T>,则T没有必要实现IComparable<T>的真正原因。在构造树而不指定比较方法的情况下强制执行T实现IComparer<T>的编译时要求可能会很好,但是如果不需要像{{1这样有点笨拙的语法,则无法做到这一点。这将创建treeInstance = factoryClass.Create<myType>()的实例。

答案 5 :(得分:0)

我猜测数据的类型为Object,因此不会自动允许&gt; =操作。
您需要为T添加一个约束,使其成为IComparable

class BinaryTree<T> where T : IComparable