C#:泛型的语义?

Nic*_*ner 1 c# generics semantics

我有一个清单:

private readonly IList<IList<GameObjectController>> removeTargets;
private readonly IList<IList<GameObjectController>> addTargets;
Run Code Online (Sandbox Code Playgroud)

PickUp继承自GameObjectController.但是,当我尝试这个:

public IList<PickUp> Inventory

// ... 

gameObjectManager.MoveFromListToWorld(this, user.Model.Inventory);

// ...

    // This queues everything up to be removed, until ProcessMoves...() is called
    public void MoveFromWorldToList(GameObjectController removedFromWorld, IList<GameObjectController> addTarget)
    {
        toBeRemoved.Add(removedFromWorld);
        addTargets.Add(addTarget);
    }

// ...

    /// <summary>
    /// Removes all the GameObjects on which removal is requested from the world.
    /// </summary>
    public void ProcessMovesFromListToWorld()
    {
        for (int i = 0; i < toBeAdded.Count; i++)
        {
            GameObjectController moved = toBeAdded[i];
            addGameObjectToWorld(moved);

            if (removeTargets[i] != null)
            {
                removeTargets[i].Remove(moved);
            }
        }
        toBeAdded.Clear();
        removeTargets.Clear();
    }
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

无法从'System.Collections.Generic.IList <PickUp>'转换为'System.Collections.Generic.IList <GameObjectController>'

为什么会这样?这不应该没问题,因为它PickUp是一个子类GameObjectController吗?我需要像Java这样的东西Map<E extends GameObjectController>吗?

早些时候,我遇到了类似的问题,我试图隐含地inventory从一个转换IList为一个ICollection.这是同样的问题吗?

Joe*_*orn 6

请在此处查看我的其他答案:
如何将IQueryable <Something>作为IQueryable <ISomething>返回

精简版:

请记住,IList<PickUp>IList<GameObjectController>是两个(且仅有两个)完全不同的类中的类型系统.它们唯一的继承关系来自继承树的System.Collections分支; 在继承树的GameObjectController分支上根本没有.你不妨试着去投IList<double>一个IList<ArgumentNullException>.

你可以做的是调用Cast<T>()可用的扩展方法IEnumerable<T>.