Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET4功能:应为通用IEnumerable<;T>;到IEnumerable<;更具体地说,T>;可能吗?_C#_.net_.net 4.0_Mono_Covariance - Fatal编程技术网

C# NET4功能:应为通用IEnumerable<;T>;到IEnumerable<;更具体地说,T>;可能吗?

C# NET4功能:应为通用IEnumerable<;T>;到IEnumerable<;更具体地说,T>;可能吗?,c#,.net,.net-4.0,mono,covariance,C#,.net,.net 4.0,Mono,Covariance,如果我在.NET 4库(在Mono上运行)中有此内部方法: 受保护的内部IEnumerable GetComponentsByType(类型componentType) { 返回this.componentsDic[componentType]; } 为了便于使用,我想用一个通用参数公开它。这就是我迄今为止所做的工作和正在发挥的作用: public IEnumerable<TComponentType> GetComponentsByType<TComponentType&g

如果我在.NET 4库(在Mono上运行)中有此内部方法:

受保护的内部IEnumerable GetComponentsByType(类型componentType)
{
返回this.componentsDic[componentType];
}
为了便于使用,我想用一个通用参数公开它。这就是我迄今为止所做的工作和正在发挥的作用:

public IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
{
    return this.GetComponentsByType (typeof(TComponentType)).Cast<TComponentType>();
}    
public IEnumerable GetComponentByType(),其中tcComponentType:KSComponent
{
返回this.GetComponentsByType(typeof(TComponentType)).Cast();
}    
但是,如果不使用.NET 4.0,这也应该起作用:

public IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
    {
        return (IEnumerable<TComponentType>)this.GetComponentsByType (typeof(TComponentType));
    }
public IEnumerable GetComponentByType(),其中tcComponentType:KSComponent
{
返回(IEnumerable)this.GetComponentsByType(typeof(tcComponentType));
}
编辑:

KSComponent
是基类,
TComponentType
可以是(例如
KSMoveComponent
,它是
KSComponent
的子类。 我遇到的情况是,上面代码所在的类包含一个特定类型的
KSComponent
列表,例如:

typeof(KSMoveComponent)
映射到
List()
。列表中的所有元素实际上都是
KSMoveComponent
类型。因此,我希望将此
List
直接转换为
List
,而不是使用
Linq.cast()
扩展名


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

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

另一方面,泛型条件允许您将泛型类型替换为更严格的类型


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

我编辑了我的问题。似乎协方差与这种情况无关。它仍然不起作用。如果我调用
GetComponentsByType()
?您现在正在将
IEnumerable
强制转换为
IEnumerable
编译器如何保证
IEnumerable
的每个成员都属于
MySuperDuperSpecificImplementationOfKSComponent
类型?它不能,这就是我希望使用显式强制转换的原因。它必须相信我,当然演员可能会失败。毕竟,我可以使用Linq.Cast()。
public IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
    {
        return (IEnumerable<TComponentType>)this.GetComponentsByType (typeof(TComponentType));
    }