将接口用作泛型类型时出现无效的强制转换异常
本文关键字:无效 异常 转换 接口 泛型类型 | 更新日期: 2023-09-27 18:29:43
所以我不确定这是不是我不理解的C#泛型问题,也不确定这是否与Unity编译器无法处理它有关。我来自C++,对C#有点经验,但对泛型没有经验。
因此,关于这个问题:我有一个名为TurnOrderQueue的泛型类。简而言之,它是一个自定义队列,它根据传入的一些值对事物进行排序。(它位于名为TurnOrderQueueNS的命名空间中)
我有一个空的(目前)接口,名为IActor,用来表示可以在回合制游戏中采取行动的东西。
最后,我有一个TurnOrderManager,它处理所有与订单有关的事情,并拥有一个TurnOrder队列。
当我尝试使用IActor作为类型来实例化TurnOrderQueue时,我会得到一个无效的强制转换异常
public TurnOrderQueueNS.TurnOrderQueue<IActor> TurnOrder = new TurnOrderQueueNS.TurnOrderQueue<IActor>();
我在运行时得到的异常是:InvalidCastException:无法从源类型强制转换为目标类型。TurnOrderQueueNS.TurnOrderQueue`1[Ictor]..ctor()TurnManager。。ctor()
你能不能不把接口作为C#中的泛型类型,或者我遗漏了什么?
根据请求这里是TurnOrderQueue.cs编辑:删除了大部分类以显示问题的实质
public class TurnOrderQueue<t>: IComparer{
private SortedList<QueueItem<t>,t> turnOrderList;
private int currentTurnIndex = 0;
#region IComparer implementation
int IComparer.Compare (object x, object y)
{
return Compare ((QueueItem<t>)x, (QueueItem<t>)y );
}
#endregion
}
public struct QueueItem<t>
{
public int priorityValue;
public int tieBreakerValue;
public t item;
}
}
IActor
接口或泛型参数类型无关。
在构造函数中,您正试图将this
强制转换为IComparer<QueueItem<t>>
。为了能够做到这一点,您的类应该实现IComparer<QueueItem<t>>
。
public class TurnOrderQueue<t> : IComparer<QueueItem<t>>
{
<skipped>
public TurnOrderQueue()
{
turnOrderList = new SortedList<QueueItem<t>, t>(this);
}
public int Compare(QueueItem<t> item1, QueueItem<t> item2)
{
<skipped>
}
}