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

最佳答案

协方差允许您将枚举类型转换为其更通用的版本。

另一方面,泛型条件允许您使用更具限制性的内容来替换泛型类型。

那为什么行得通呢?似乎其中两个正在朝两个不同的方向前进-不?

08-04 13:51