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!
}
}