0

我正在尝试将通用 ValueCollection 作为 ICollection 返回。从他的 MSDN 文档中,它说 Dictionary.ValueCollection 实现了 ICollection 接口。但由于某种原因,当它需要将 ValueCollection 转换为 ICollection 时,我收到一个错误。这是代码示例,下面是我收到的错误。

public ICollection<T> GetAllComponents<T>() where T : Component
    {
        Dictionary<Entity, Component>.ValueCollection retval = null;

        if(!this.componentEntityDatabase.ContainsKey(typeof(T)))
        {
            Logger.w (Logger.GetSimpleTagForCurrentMethod (this), "Could not find Component " + typeof(T).Name + " in database");
            return new List<T>();
        }

        Dictionary<Entity, Component> entityRegistry = this.componentEntityDatabase [typeof(T)];

        retval = entityRegistry.Values;

        return (ICollection<T>)retval;

    }

错误:

Cannot convert type 'Systems.Collections.Generic.Dictionary<Entity,Component>.ValueCollection' to System.Collections.Generic.ICollection<T>

我做错了吗?还是有另一种方法可以在不复制字典中的值的情况下完成此操作?

4

1 回答 1

0

在这种情况下,ValueCollection实现ICollection<Component>,而不是ICollection<T>。即使Tmust 是 a Component,您也不能保证所有值都是 type T

这里有几个选择:

  • 将返回类型更改为ICollection<Component>
  • 如果从返回的字典中的所有值componentEntityDatabase都是 type T,则更entityRegistry改为Dictionary<Entity, T>

  • 用于OfType返回类型为 的值:T

    retval = entityRegistry.Values.OfType<T>().ToList();  // turn into a List to get back to `ICollection<T>`  
    

编辑

仔细观察后,您将不得不将结果限制为仅 type 的对象T。使用OfType可能是最安全的方法。

于 2013-08-21T01:01:49.760 回答