2014-02-20 5 views
3

Мне кажется, что я должен быть в состоянии сделать это? Но я не могу.Тип возвращаемого значения метода дженериков

public Dictionary<Type, List<ParserRuleContext>> Contexts { get; private set; } 

public IEnumerable<T> GetAllContextsOfType<T>() where T:ParserRuleContext 
{ 
    return (List<T>)Contexts[typeof(T)]; 
} 

Это дает ошибку:

Cannot convert type 'System.Collections.Generic.List<ParserRuleContext>' 
to 'System.Collections.Generic.List<T>' 

Учитывая, что список ограничивается быть Перечислите <ParserRuleContext> по ИНЕКЕ, я не понимаю этого?

+0

Вы пробовали изменения вернуть список ? –

+0

Да, тот же результат. – AndySavage

ответ

4

Просто потому, что вы знаете, что для конкретного Type, вы только собираетесь хранить объекты этого определенного типа в List<ParserRuleContext> с tored здесь :

public Dictionary<Type, List<ParserRuleContext>> Contexts 

Там не хватает информации для системы типа также знать этот факт. Что касается этого, каждый из этих списков может содержать все виды объектов, все из которых происходят от ParserRuleContext. Очевидно, что такой список не может быть напрямую применен к более конкретному типу списка.

И общие типы не (вообще) не отражают структуру наследования, которую выполняют их параметры типа. Таким образом, это не похоже, что вы могли бы сохранить List<TypeDerivedFromParserRuleContext> в этом словаре - потому что List<TypeDerivedFromParserRuleContext> не наследует от List<ParserRuleContext>.


По крайней мере, я предполагаю, что это предположение, по которому вы верите, что остальная часть этого кода «смысл»

6

Я считаю, что должно быть тем фактом, что экземпляр списка быть с другим tipage списка в словаре, если вы сделаете слепок с помощью LINQ, чтобы решить

return Contexts[typeof(T)].Cast<T>(); 

или

return Contexts[typeof(T)].ToList<T>(); 
+0

Это помогает решить проблему (не знаю, почему я об этом не думал). Я все еще не уверен, зачем это нужно. – AndySavage

+0

Хотя вместо кастинга он создает совершенно новый объект, который может скрыть актуальную проблему. – Lanorkin

+0

Как я уже сказал, я считаю, что это должен быть экземпляр списка, так что если вы дадите тип двух разных типов ввода, вы получите так: System.Collections.Generic.List [T genérico ...] e System. Коллекции. Generic.List [ParserRuleContex] –

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