通用节点C#的通用树

时间:2019-12-18 08:30:15

标签: c# .net generics

我正在尝试创建通用节点对象的通用树类。

using System;
using System.Collections;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        Tree<Node<int>> tree = new Tree<Node<int>>();
    }
}

public class Tree<T> : IEnumerable<T>
    where T : IComparable<T>
{
    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

public class Node<TNode> : IComparable<TNode>
    where TNode : IComparable<TNode>
{
    TNode Value;
    public int CompareTo(TNode other)
    {
        return Value.CompareTo(other);
    }
}

但是在主要方法中,我收到编译错误:

The type 'BinaryTree.Node<int>' cannot be used as type parameter 'T' in the generic type or method 'Tree<T>'. There is no implicit reference conversion from 'BinaryTree.Node<int>' to 'System.IComparable<BinaryTree.Node<int>>'.

有人可以帮助我了解问题所在吗?

2 个答案:

答案 0 :(得分:8)

问题出在您的Node<>类中-您曾说过Node与其中的值类型可比。相反,您应该说它可以与另一个具有相同值的 node 相媲美:

public class Node<TNode> : IComparable<Node<TNode>>
    where TNode : IComparable<TNode>
{
    TNode Value;
    public int CompareTo(Node<TNode> other)
    {
        return Value.CompareTo(other.Value);
    }
}

此时,可以创建一个Tree<Node<int>>

但是最好实际创建一个Tree<int>,并在内部使用Tree<T>来代替Node<T>。这可能更易于使用。毕竟,每棵树都会有节点。用相对较少的代码很难确定,但是我怀疑这实际上是您想要做的。

答案 1 :(得分:3)

我想你和我一样对命名标准感到困惑。

此声明有问题:

public class Node<TNode> : IComparable<TNode>
    where TNode : IComparable<TNode>

让我们通过重命名通用参数来重写它:

public class Node<T> : IComparable<T>
    where TNode : IComparable<T>

在这里您可以看到您声明它可以与它存储的值进行比较,而不是与其他节点进行比较。

由于树类型要求 T才能与相同类型的值进行比较,因此您需要节点能够与其他节点进行比较,如下所示:< / p>

                                   changed
                                   v-----v
public class Node<T> : IComparable<Node<T>>
    where TNode : IComparable<TNode>