C5.IPriorityQueueHandle 中的无效转换
Invalid Cast in C5.IPriorityQueueHandle
我在使用 C5 IntervalHeap 实现 C5.IPriorityQueueHandle 接口时遇到问题。我可以使用具有空句柄的堆,使用默认的 DeleteMin() 等,但我希望稍后能够通过句柄更新优先级。
下面是我的代码的简化版本,以及异常文本:
异常:
'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!
}
}
您错误地使用了 C5 库的句柄。
来自 C5 documentation 用于 C5.IntervalHeap<T>.Add
方法的 handle
参数(强调我的):
On output: a handle for the added item. On input: null for allocating a new handle, an invalid handle for reuse. A handle for reuse must be compatible with this priority queue, by being created by a priority queue of the same runtime type, but not necessarily the same priority queue object.
您没有传入由优先级队列创建的句柄。您正在传递自己在 Node
class 的构造函数中创建的句柄。
不要创建自己的 IPriorityQueueHandle<T>
实现;而是依赖于从 C5 返回的任何句柄对象。我建议您将 Node
中的 handle
字段的类型更改为 IPriorityQueueHandle<Node>
,不要在 Node
构造函数中对其进行初始化,并更改断行上的调用
q.Add(ref childNode.handle, childNode);
可以删除之前分配给变量 h
的行,您的 Handle<T>
class.
也可以删除
我在使用 C5 IntervalHeap 实现 C5.IPriorityQueueHandle 接口时遇到问题。我可以使用具有空句柄的堆,使用默认的 DeleteMin() 等,但我希望稍后能够通过句柄更新优先级。
下面是我的代码的简化版本,以及异常文本:
异常: '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!
}
}
您错误地使用了 C5 库的句柄。
来自 C5 documentation 用于 C5.IntervalHeap<T>.Add
方法的 handle
参数(强调我的):
On output: a handle for the added item. On input: null for allocating a new handle, an invalid handle for reuse. A handle for reuse must be compatible with this priority queue, by being created by a priority queue of the same runtime type, but not necessarily the same priority queue object.
您没有传入由优先级队列创建的句柄。您正在传递自己在 Node
class 的构造函数中创建的句柄。
不要创建自己的 IPriorityQueueHandle<T>
实现;而是依赖于从 C5 返回的任何句柄对象。我建议您将 Node
中的 handle
字段的类型更改为 IPriorityQueueHandle<Node>
,不要在 Node
构造函数中对其进行初始化,并更改断行上的调用
q.Add(ref childNode.handle, childNode);
可以删除之前分配给变量 h
的行,您的 Handle<T>
class.