2

如果我在 .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>(). 列表的所有元素实际上都是 type KSMoveComponent。所以我想让它直接List<KSComponent>被转换List<KSMoveComponent>,而不是使用Linq.Cast()扩展。

这归结为一个问题:我有汽车清单,我可以 100% 确定它们都是梅赛德斯 - 为什么我不能得到梅赛德斯的清单?:-)

4

1 回答 1

1

协方差允许您将 enumerable 转换为更通用的版本。

另一方面,泛型条件允许您用更严格的东西替换泛型类型。

那么它为什么会起作用呢?似乎他们两个朝着两个不同的方向前进——不是吗?

于 2013-02-15T21:57:17.120 回答