无法将类型'System.Collections.Generic.Dictionary <class,class =“”>。ValueCollection转换为System.Collections.Generic.ICollection <t> </t> </class,>

时间:2013-08-21 00:50:50

标签: c# xamarin-studio

我正在尝试将通用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>

我这样做错了吗?或者是否有另一种方法可以实现这一点而无需复制字典中的值?

1 个答案:

答案 0 :(得分:0)

在这种情况下,ValueCollection实施ICollection<Component>,而不是ICollection<T>。即使T必须是Component,也不能保证所有值都是T类型。

以下是一些选择:

  • 将退货类型更改为ICollection<Component>
  • 如果从componentEntityDatabase返回的词典中的所有值都属于T类型,请将entityRegistry更改为Dictionary<Entity, T> < / p>

  • 使用OfType仅返回 类型T的值

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

修改

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