如果我在.NET 4库中有此内部方法(在此处运行Mono):
protected internal IEnumerable<KSComponent> GetComponentsByType(Type componentType)
{
return this.componentsDic [componentType];
}
我想使用通用参数公开它,以简化使用。这是我到目前为止所做的并且正在起作用:
public IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
{
return this.GetComponentsByType (typeof(TComponentType)).Cast<TComponentType>();
}
但是,不应与.NET 4.0一起使用:
public IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
{
return (IEnumerable<TComponentType>)this.GetComponentsByType (typeof(TComponentType));
}
编辑:
KSComponent
是基类,TComponentType
可以是(例如)KSMoveComponent
,它是KSComponent
的子类。我遇到的情况是,上面代码来自的类拥有特定类型的
KSComponent
列表,例如:typeof(KSMoveComponent)
映射到List<KSComponent>()
。列表中的所有元素实际上都是KSMoveComponent
类型。所以我想直接将此List<KSComponent>
强制转换为List<KSMoveComponent>
而不是使用Linq.Cast()
扩展名。问题归结为:我有汽车清单,可以100%确定它们都是梅赛德斯-那为什么我不能得到梅赛德斯清单? :-)
最佳答案
协方差允许您将枚举类型转换为其更通用的版本。
另一方面,泛型条件允许您使用更具限制性的内容来替换泛型类型。
那为什么行得通呢?似乎其中两个正在朝两个不同的方向前进-不?