NET4 功能:是否应该可以将通用 IEnumerable 转换为 IEnumerable

本文关键字:IEnumerable MoreSpecifi 转换 是否 功能 NET4 | 更新日期: 2023-09-27 17:59:41

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

NET4 功能:是否应该可以将通用 IEnumerable<T> 转换为 IEnumerable<MoreSpecifi

方差允许您将可枚举强制转换为其更通用的版本。

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

那么为什么它会起作用呢?似乎他们中的两个正在朝着两个不同的方向发展 - 不是吗?