1

所以我不确定这是否是我不理解的 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# 中使用接口作为泛型类型,还是我错过了什么?

每个请求这里是 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;
    }

}
4

1 回答 1

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>
    }
 }
于 2013-09-05T12:02:44.473 回答