NET4功能:应该将通用的IEnumerable <t>转换为IEnumerable <morespecifict>吗?</morespecifict> </t>

时间:2013-02-15 21:51:28

标签: c# .net .net-4.0 mono covariance

如果我在.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%确定它们都是梅赛德斯 - 为什么我不能得到梅赛德斯的清单呢? : - )

1 个答案:

答案 0 :(得分:1)

Covariance允许您将枚举转换为更通用的版本。

另一方面,通用条件允许您用更具限制性的东西替换泛型类型。

那为什么会有效呢?看起来他们中的两个正朝着两个不同的方向前进 - 没有?