2013-08-21 2 views
0

Я пытаюсь вернуть общий ValueCollection как ICollection. Из документов MSDN говорится, что Dictionary.ValueCollection реализует интерфейс ICollection. По какой-то причине, однако, я получаю сообщение об ошибке, когда ему нужно вывести ValueCollection как ICollection. Это пример кода, и ниже это ошибка, которую я получаю.не может преобразовать тип 'System.Collections.Generic.Dictionary <класс, класс> .ValueCollection в System.Collections.Generic.ICollection <T>

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

в этом случае, ValueCollection комплектующие ICollection<Component>, а не ICollection<T>. хотя T должен быть Component, вы не гарантируете, что все значения будут иметь тип T.

Вот несколько вариантов:

  • Изменить тип возврата к ICollection<Component>
  • Если все значения в словаре вернувшийся из 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, вероятно, самый безопасный способ сделать это.

Смежные вопросы

 Смежные вопросы