C5 IntervalHeap을 사용하여 C5.IPriorityQueueHandle 인터페이스를 구현하는 데 문제가 있습니다. 기본 DeleteMin() 등을 사용하여 null 핸들로 힙을 사용할 수 있지만 나중에 핸들 우선 순위를 업데이트 할 수 있기를 원합니다.C5.IPriorityQueueHandle의 잘못된 캐스트
내 코드의 단순화 된 버전은 예외 텍스트와 함께 다음과 같습니다 :
예외 : 할 수 없음 'System.InvalidCastException'형식의 처리되지 않은 예외가 C5.dll에
추가 정보를 발생 'Handle`1 [_8_Puzzle.Node]'유형의 캐스트 객체를 입력하여 '[_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!
}
}