我正在尝试将通用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>
我这样做错了吗?或者是否有另一种方法可以实现这一点而无需复制字典中的值?
答案 0 :(得分:0)
在这种情况下,ValueCollection
实施ICollection<Component>
,而不是ICollection<T>
。即使T
必须是Component
,也不能保证所有值都是T
类型。
以下是一些选择:
ICollection<Component>
如果从 < / p> componentEntityDatabase
返回的词典中的所有值都属于T
类型,请将entityRegistry
更改为Dictionary<Entity, T>
使用OfType
仅返回 类型T
的值
retval = entityRegistry.Values.OfType<T>().ToList(); // turn into a List to get back to `ICollection<T>`
修改强>
仔细观察后,您将不得不将结果限制为T
类型的对象。使用OfType
可能是最安全的方法。