Проблемы с реализацией родового IENUMERATOR и IMPARABLE
-
27-09-2019 - |
Вопрос
Я работаю над деревом AVL. Сам дерево, кажется, работает, но мне нужен итератор для прогулки по ценностям дерева. Поэтому я попытался реализовать межаную информацию IEnumerator. К сожалению, я получаю ошибку времени компиляции, реализующую IEnumerator и Imparable. Сначала код и ниже, что ошибка.
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» не может использоваться в качестве параметра типа «T» в общем типе или методе «OPDR2_AVLTREETEST_Final.avltreenode». Там нет преобразования бокса или параметра типа «T» на «System. Comparable».
Эта ошибка приведена на следующих строках:
//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
Пока я не включал дерево и логику узла. Я кого-нибудь думает, что необходимо решить эту проблему, просто скажи так!
Спасибо!
Решение
Не могли бы вы попробовать изменить его к этому
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;}
}
Попробуйте это (изменил тип Imparable Parameter):
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.
}
Как уже указано, вы не включали весь код, но вы ограничивались только на ICEPARABLEu003CT> , тогда как перечисленная вами ошибка заключается в том, что она хотела реализовать Imparable (т.е. неребную форму Imparable)