C# NET4功能:应为通用IEnumerable<;T>;到IEnumerable<;更具体地说,T>;可能吗?
如果我在.NET 4库(在Mono上运行)中有此内部方法: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
受保护的内部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.Castpublic IEnumerable<TComponentType> GetComponentsByType<TComponentType>() where TComponentType : KSComponent
{
return (IEnumerable<TComponentType>)this.GetComponentsByType (typeof(TComponentType));
}