将接口用作泛型类型时出现无效的强制转换异常

本文关键字:无效 异常 转换 接口 泛型类型 | 更新日期: 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>
    }
 }