Я попытался разработать универсальный класс «MinHeap (T)», реализующий IComparable. Он отлично работает, когда generic является «int» или другим классом «Code». Далее и используя для T общий класс «Node (Code)» приводит к ошибке, упомянутой ниже.Generics и IComparable - ошибка CS00301
Я, вероятно, слишком новый и не понимающий тонких различий между IComparable и IComparable (T). У кого-то есть идея? Заранее спасибо за вашу помощь, LJ
public class MinHeap<T> where T : IComparable
{
...
}
public class Node<T> where T : IComparable
{
T data
...
public int CompareTo(object obj)
{
Node<T> otherNode = obj as Node<T>;
return this.data.CompareTo(otherNode.data);
}
...
}
public class Code : IComparable
{
public int freq;
...
public int CompareTo(object obj)
{
Code otherCode = obj as Code;
return this.freq.CompareTo(otherCode.freq);
}
}
static void Main(string[] args)
{
MinHeap<int> hInt = new MaxHeap<int>(heapSeed); // works fine
MinHeap<Code> hCode = new MinHeap<Code>(codeList); // works fine
...
Node<Code>[] nodeCodeList = new Node<Code>[freqList.Length]; // ok
MinHeap<Node<Code>> h = new MinHeap<Node<Code>>(nodeCodeList); // Error
...
}
Сообщение об ошибке:
Ошибка 2 Типа 'Algorithms.Node (Algorithms.Code)' не может быть использована в качестве параметра типа 'Т' в общий тип или метод «Алгоритмы.MinHeap (T)». Нет никакого неявного ссылочного преобразования из «Алгоритмы.Node (Алгоритмы.Код)» в «System.IComparable».
'T' должно быть не только сопоставимым,' Узел 'тоже должен быть. –
leppie
Следующее должно работать: 'public class Node: IComparable, где T: IComparable'. То же самое для MinHeap. @Aphelion имеет объяснение. –
leppie
Работает теперь отлично - не нужно было делать то же самое для MinHeap - Большое спасибо –
CSJNL