痛苦泛型,运算符 '>=' 不能应用于类型为“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 实现 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