所以我不确定这是否是我不理解的C#泛型问题,或者它是否与Unity编译器无法处理它有关。我来自C ++,我对c#有一点经验,但没有使用泛型。
所以关于这个问题: 我有一个名为TurnOrderQueue的泛型类。简而言之,它是一个自定义队列,它根据传入的一些值来命令事物。 (它位于名为TurnOrderQueueNS的名称空间中)
我有一个名为IActor的空(现在)界面,用于表示可以在回合制游戏中执行操作的内容。
最后,我有一个TurnOrderManager,可以处理所有转弯顺序并拥有TurnOrderQueue。
当我尝试使用IActor实例化TurnOrderQueue作为类型时,我获得了无效的强制转换异常
public TurnOrderQueueNS.TurnOrderQueue<IActor> TurnOrder = new TurnOrderQueueNS.TurnOrderQueue<IActor>();
我在运行时获得的异常是: InvalidCastException:无法从源类型转换为目标类型。 TurnOrderQueueNS.TurnOrderQueue`1 [IActor] .. ctor() TurnManager..ctor()
你能否在C#中使用Interfaces作为泛型类型,或者我错过了什么?
Per Request这是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;
}
}
答案 0 :(得分:2)
您获得的异常与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>
}
}