2017-01-13 2 views
0

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! 

     } 
    } 

답변

1

C5 라이브러리가있는 핸들을 잘못 사용하고 있습니다. C5.IntervalHeap<T>.Add 방법 (강조 내)의 handle 매개 변수 C5 documentation 가입일

:

출력 중 : 추가 항목에 대한 핸들. 입력시 : 새 핸들 할당에 대해서는 null이고 재사용을위한 잘못된 핸들입니다. 재사용 핸들은 동일한 런타임 유형의 우선 순위 대기열에 의해 생성되어이 우선 순위 대기열과 호환 가능해야하지만 반드시 동일한 우선 순위 대기열 객체 일 필요는 없습니다.

우선 순위 대기열로 만든 핸들을 전달하지 않습니다. Node 클래스의 생성자에서 직접 만든 핸들을 전달하고 있습니다.

IPriorityQueueHandle<T>을 직접 구현하지 마십시오. C5에서 가져온 객체를 처리하는 대신에 의존합니다. 나는 Node 생성자를 초기화하지 않습니다, 당신은 IPriorityQueueHandle<Node>Nodehandle 필드의 유형을 변경하는 것이 좋습니다, 당신은 할당

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

전에 라인에 브레이크 라인에 전화를 바꿀 것 변수 h을 삭제할 수 있으며 Handle<T> 클래스도 마찬가지입니다.

관련 문제