与实施通用的IEnumerator和IComparable的问题
-
27-09-2019 - |
题
我工作的AVL树。树本身似乎是工作,但我需要一个迭代器通过树的值走路。因此,我试图实现IEnumerator interace。不幸的是,我得到落实的IEnumerator和IComparable的一个编译时错误。第一代码和下面的错误。
class AvlTreePreOrderEnumerator<T> : IEnumerator<T> where T :IComparable<T>
{
private AvlTreeNode<T> current = default(T);
private AvlTreeNode<T> tree = null;
private Queue<AvlTreeNode<T>> traverseQueue = null;
public AvlTreePreOrderEnumerator(AvlTreeNode<T> tree)
{
this.tree = tree;
//Build queue
traverseQueue = new Queue<AvlTreeNode<T>>();
visitNode(this.tree.Root);
}
private void visitNode(AvlTreeNode<T> node)
{
if (node == null)
return;
else
{
traverseQueue.Enqueue(node);
visitNode(node.LeftChild);
visitNode(node.RightChild);
}
}
public T Current
{
get { return current.Value; }
}
object IEnumerator.Current
{
get { return Current; }
}
public void Dispose()
{
current = null;
tree = null;
}
public void Reset()
{
current = null;
}
public bool MoveNext()
{
if (traverseQueue.Count > 0)
current = traverseQueue.Dequeue();
else
current = null;
return (current != null);
}
}
通过VS2008给出的误差: 错误1型“T”不能被用作在通用类型或方法“Opdr2_AvlTreeTest_Final.AvlTreeNode”类型参数“T”。存在从“T”到“System.IComparable”。
没有装箱转换或类型参数转换给出对以下行此错误:
//members
private AvlTreeNode<T> current = default(T); //current highlighted
private AvlTreeNode<T> tree = null; //tree highlighted
private Queue<AvlTreeNode<T>> traverseQueue = null; //traverseQueue highlighted
//Constructor
public AvlTreePreOrderEnumerator(AvlTreeNode<T> tree) // AvlTreePreOrderEnumerator highlighted
//Method
private void visitNode(AvlTreeNode<T> node) //visitNode highlighted
有关现在我不包括树和节点的逻辑。我认为任何人有必要解决这个问题,只是说!
THX!
解决方案
你能尝试改变这种
class AvlTreePreOrderEnumerator<T> : IEnumerator<T> where T :IComparable
其他提示
我怀疑你宣布你的节点类为这样的:
public class AvlTreeNode<T> where T : IComparable<AvlTreeNode<T>> {
public AvlTreeNode<T> Root;
public AvlTreeNode<T> LeftChild {get;set;}
public AvlTreeNode<T> RightChild {get;set;}
public T Value { get; set;}
}
尝试此(改变IComparable的参数类型):
public class AvlTreeNode<T> where T : IComparable<T> {
public AvlTreeNode<T> Root;
public AvlTreeNode<T> LeftChild {get;set;}
public AvlTreeNode<T> RightChild {get;set;}
public T Value { get; set;}
}
您也有您current
场改成这样:
private AvlTreeNode<T> current = new AvlTreeNode<T>();
虽然还没有公布实际的代码导致错误(Opdr2_AvlTreeTest_Final.AvlTreeNode
)然而,我强烈怀疑的问题是,你是在一个通用的方法/类型与不是限制实施IComparable<T>
类型参数使用这个类。
可以再现一个类似的错误用一个简单的示例:
// no problem here at definition site:
void IsLarger<T>(T a, T b) where T : IComparable<T> {
return a.CompareTo(b) > 0;
}
void Test<T>(T arg) { // note: T is not necessarily IComparable<T>
Console.WriteLine(IsLarger(arg, arg)); // The compiler shouldn't allow this.
}
正如已指出,你有没有包括所有的代码,但只约束吨至了IComparable
不隶属于 StackOverflow