2017-01-13 8 views
0

C5 IntervalHeapでC5.IPriorityQueueHandleインターフェイスを実装する際に問題があります。デフォルトのDeleteMin()などを使用してnullハンドルでヒープを使用することはできますが、後でハンドルで優先度を更新できるようにしたいと考えています。C5.IPriorityQueueHandleの無効なキャスト

私のコードの簡易版は、例外テキストと一緒に、以下の通りです:

例外:できません:型「System.InvalidCastExceptionの」の未処理の例外はC5.dllに

発生しました追加情報 'Handle`1 [_8_Puzzle.Node]'型のキャストオブジェクトに '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! 

     } 
    } 

答えて

1

C5ライブラリのハンドルが正しく使用されていません。 C5.IntervalHeap<T>.Add方法(強調鉱山)のhandleパラメータのC5 documentationから

出力の場合:追加されたアイテムのハンドル。入力時:新しいハンドルを割り当てる場合はnull、再利用の場合は無効なハンドル。 再利用のためのハンドルは、同じランタイムタイプの優先度キューによって作成され、必ずしも同じ優先度キューオブジェクトである必要はなく、この優先度キューと互換性がなければなりません。

優先キューで作成されたハンドルを渡すことはありません。 Nodeクラスのコンストラクタで作成した独自のハンドルを渡しています。

IPriorityQueueHandle<T>の独自の実装を作成しないでください。代わりにC5から戻ってくるオブジェクトを処理するものに依存しています。私はNodeコンストラクタでそれを初期化し、

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

に破断回線のコールを変更しないでください、あなたはIPriorityQueueHandle<Node>Nodehandleフィールドの種類を変更するには、に割り当てる前に行を、推薦します変数hは、Handle<T>クラスと同様に削除できます。

関連する問題