我正在尝试创建通用节点对象的通用树类。
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>>'.
有人可以帮助我了解问题所在吗?
答案 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>