Il s'agit d'un défi pour les génériques C#/modèles de conception. J'essaie d'implémenter un tas générique, puis une file d'attente prioritaire qui utilise le segment de mémoire.C# Génériques: Insertion de T en tant que T: IComparable <T> conflit d'interface
Ma signature de tas est:
class Heap<TKey, TValue> where TKey : IComparable<TKey>
Ma classe de file d'attente prioritaire est:
public delegate IComparable<T> Evaluator<T>(T item);
class PriorityQueue<T> : IQueue<T>
{
Evaluator<T> Evaluate;
Heap<IComparable<T>, T> m_heap;
public PriorityQueue(Evaluator<T> evaluateFunction)
{
Evaluate = evaluateFunction;
m_heap = new Heap<int, T>(HeapType.MinHeap);
}
...
public void Insert(T element)
{
m_heap.Insert(Evaluate(element), element);
}
...
Mais en le faisant, le compilateur (à juste titre) se plaint que ICompareble ne met pas en oeuvre l'interface ICompareble, d'où
Heap<IComparable<T>, T> m_heap;
conflits avec
where TKey : IComparable<TKey>
Que pouvez-vous faire pour résoudre ce problème ?!
erreur complète du compilateur:
The type 'System.IComparable<T>' cannot be used as type parameter 'TKey' in the generic type or method 'Heap<TKey,TValue>'. There is no implicit reference conversion from 'System.IComparable<T>' to 'System.IComparable<System.IComparable<T>>'.
Puisque vous semblez toujours initialiser m_heap comme '' nouveau segment de mémoire, pourquoi ne pas changer votre déclaration HEAP m_heap; '? –
kevingessner
Ce ne devrait pas être "où TKey: IComparable"? Si je ne me trompe pas, c'est ce qu'évaluera le retour. –
Bubblewrap