将接口用作泛型类型时,无效的Cast Exception

时间:2013-09-01 03:25:26

标签: c# generics interface unity3d .net

所以我不确定这是否是我不理解的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;
    }

}

1 个答案:

答案 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>
    }
 }