【问题标题】:Comparison in C#: operator '<' cannot be applied to operands of type 'T' and 'T'C# 中的比较:运算符“<”不能应用于“T”和“T”类型的操作数
【发布时间】:2018-02-08 09:45:12
【问题描述】:

我创建了一个 BinaryTreeNode&lt;T&gt; 类,然后为 BinaryTree&lt;T&gt; 类创建了 Add(T data) 方法。

当我尝试比较对象的值时,编译器会说:

运算符“。

例子:

  public void AddNode(T data) {
        BinaryTreeNode<T> node = new BinaryTreeNode<T>(data);
        BinaryTreeNode<T> temp = root;

        if (temp.Value < node.Value) // **PROBLEM HERE**
        ...

我正在使用 VS08 Express Edition。

【问题讨论】:

  • 你真的有一个名为“T”的类吗?

标签: c# generics


【解决方案1】:

您应该添加一个约束,使得 T 必须实现 IComparable&lt;T&gt; 然后使用它:

public class BinaryTree<T> where T : IComparable<T>
{
    public void AddNode(T data)
    {
        BinaryTreeNode<T> node = new BinaryTreeNode<T>(data);
        BinaryTreeNode<T> temp = root;

        if (temp.Value.CompareTo(node.Value) < 0)
        ...

另一种方法是传入 IComparer&lt;T&gt; 并使用它:

public class BinaryTree<T> where T : IComparable<T>
{
    private readonly IComparer<T> comparer;

    public BinaryTree(IComparer<T> comparer)
    {
        this.comparer = comparer;
        ...
    }

    public void AddNode(T data)
    {
        BinaryTreeNode<T> node = new BinaryTreeNode<T>(data);
        BinaryTreeNode<T> temp = root;

        if (comparer.Compare(temp.Value, node.Value) < 0)

这是保证“

【讨论】:

  • 太棒了。我应该在 3 小时前问的:-)。您能否补充一下如何为没有实现它的 Ts 实现 IComparable
  • 如果 T 本身没有实现 IComparable&lt;T&gt;,那么您可能想要使用 IComparer&lt;T&gt; 方法 - 它实现起来非常简单,您只需比较给定的值并返回一个负数,a正数或 0,具体取决于该比较。
【解决方案2】:

考虑使用Generic Constraints 来缩小 T 可以是的类型。这样您就可以确保它们可以使用您的运算符进行比较。

此时 T 可以是 any 对象。例如,如果您有一个 Car 对象,编译器如何知道如何说一辆 Car “小于”或“大于”另一辆?这就是你需要约束的原因。

【讨论】:

  • 谢谢。您消除了他们无法比较的疑虑。(+1)
【解决方案3】:

Value 的类型(int、string、char[]、MyClass、YourClass 等)不支持 '

T 需要实现 IComparable 类,以便与其他 T 类型的对象进行比较。

所以,你的函数声明必须对 T 施加一个约束:

public class BinaryTree<T> where T : IComparable<T>
{
    public void AddNode(T data) 

并且您必须确保无论 T 是什么,它都必须实现 IComparable。

public class MyData : IComparable<MyData>
{
    public int CompareTo(MyData other)
    {
         // return -1 if 'this' is smaller than other, 0 if equals, 1 otherwise
    }
}

在添加函数中,然后调用

if( temp.Value.CompareTo(node.Value) < 0 )

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多