泛型方法的类型返回值

时间:2014-02-20 14:20:02

标签: c# generics

在我看来,我应该能够做到这一点?但我不能。

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>'

鉴于List被约束为List&lt; ParserRuleContext&gt;在where子句中,我不明白这个?

2 个答案:

答案 0 :(得分:6)

我认为应该是这样一个事实:列表的实例与字典中的列表具有不同的尖端,如果你使用linq进行演员是要解决

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

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

答案 1 :(得分:4)

仅仅因为知道,对于特定的Type,你只会在<{1}中存储 特定类型的对象存储在这里 1

List<ParserRuleContext>

类型系统没有足够的信息来了解这一事实。就它而言,每个列表都可以包含所有类型的对象,所有这些对象都来自public Dictionary<Type, List<ParserRuleContext>> Contexts 。这样的列表显然无法直接转换为任何更具体的列表类型。

泛型类型(通常)不会镜像其类型参数所做的任何继承结构。因此,您可能不会在此词典中存储ParserRuleContext - 因为List<TypeDerivedFromParserRuleContext>不会从List<TypeDerivedFromParserRuleContext>继承。


1 至少,我认为这是你认为其余代码“有意义”的假设