2017-01-13 2 views
0

Ich habe Probleme beim Implementieren der C5.IPriorityQueueHandle-Schnittstelle mit dem C5 IntervalHeap. Ich kann die Heap-Funktion mit Null-Handles verwenden, indem ich den Standard-DeleteMin() usw. verwende, aber ich möchte die Priorität später durch das Handle aktualisieren können.Ungültiger Cast in C5.IPriorityQueueHandle

Eine vereinfachte Version meiner Code ist unten zusammen mit dem Ausnahmetext:

Ausnahme: Eine nicht behandelte Ausnahme des Typs ‚System.InvalidCastException‘ aufgetreten in C5.dll

Zusätzliche Informationen: Kann nicht Wirf ein Objekt des Typs 'Handle`1 [_8_Puzzle.Node]' in 'Handle [_8_Puzzle.Node]'.

public class Node : IComparable<Node> 
{ 
    public Board board; 
    public Handle<Node> handle; 
    public Node(Board b) 
    { 
     this.board = b; 
     this.handle = new Handle<Node> (b.Id); 
    } 

    ... 
} 

public class Handle<Node> : C5.IPriorityQueueHandle<Node> 
{ 
    private int id; 

    public Handle(int id) 
    { 
     this.id = id; 
    } 
} 

static void doWork(Node rootNode) 
    { 
     C5.IntervalHeap<Node> q = new C5.IntervalHeap<Node>(); 
     q.Add(rootNode); //works fine, handle is null 

     ... 

     Board child = getChild(rootNode); 

     if (someConditionIsMet) { 

      Node childNode = new Node(child); 
      C5.IPriorityQueueHandle<Node> h = (C5.IPriorityQueueHandle<Node>)(childNode.handle); 
      q.Add(ref h, childNode); //breaking line! 

     } 
    } 

Antwort

1

Sie verwenden Griffe mit der C5-Bibliothek falsch.

Vom C5 documentation für die handle Parameter der C5.IntervalHeap<T>.Add Methode (Hervorhebung von mir):

Am Ausgang: ein Griff für den zusätzlichen Artikel. Bei der Eingabe: null zum Zuweisen eines neuen Handles, eines ungültigen Handles zur Wiederverwendung. Ein Handle zur Wiederverwendung muss mit dieser Prioritätswarteschlange kompatibel sein, indem er von einer Prioritätswarteschlange des gleichen Laufzeittyps erstellt wird, aber nicht notwendigerweise das gleiche Prioritätswarteschlangenobjekt.

Sie übergeben kein Handle, das von einer Prioritätswarteschlange erstellt wurde. Sie übergeben Ihre eigenen Handles, die Sie im Klassenkonstruktor Node erstellen.

Erstellen Sie keine eigene Implementierung von IPriorityQueueHandle<T>; Verlassen Sie sich stattdessen auf die Objekte, die Sie von C5 zurückbekommen. Ich würde Ihnen empfehlen, den Typ des in Node-IPriorityQueueHandle<Node>handle Feldes zu ändern, initialisiere es nicht im Node Konstruktor und den Anruf ändern auf der Bruchlinie zu

 q.Add(ref childNode.handle, childNode); 

Die Linie vor, in dem Sie zuweisen Die Variable h kann gelöscht werden, ebenso wie Ihre Handle<T> Klasse.

Verwandte Themen