如果我在.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%确定它们都是梅赛德斯 - 为什么我不能得到梅赛德斯的清单呢? : - )
答案 0 :(得分:1)
Covariance允许您将枚举转换为更通用的版本。
另一方面,通用条件允许您用更具限制性的东西替换泛型类型。
那为什么会有效呢?看起来他们中的两个正朝着两个不同的方向前进 - 没有?