在我看来,我应该能够做到这一点?但我不能。
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子句中,我不明白这个?
答案 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 至少,我认为这是你认为其余代码“有意义”的假设