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

本文关键字:操作数 类型 不能 泛型 运算符 痛苦 应用于 | 更新日期: 2023-09-27 18:21:34

这是我的代码:

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) 点我收到错误:

运算符">="不能应用于类型"T"和"T"的操作数

如何解决错误?

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

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

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

的经典解决方案是(1(使T IComparable<T>,或(2(对你的类使用IComparer<T>或函子。

(1(

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

(二(

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

我不了解 C#,但在 Java 中,您需要有一个通用 Comparator 类的实例,并使用要比较的类型进行参数化。这个泛型类提供了一个 compareTo(( 函数,该函数将以允许比较两种类型的方式实现。

T 应该是实现 IComparable 的类型,然后使用其 compareto to 方法而不是>=。 如果仍要支持>=,运算符重载是另一种选择。

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

我猜数据是 Object 类型,因此不会自动允许>= 操作。
您需要为 T 添加一个约束,以便它是可比较的

class BinaryTree<T> where T : IComparable