나는 .NET 4 도서관에서 내부 방법은 (여기 모노에서 실행)이있는 경우 :NET4 기능 : 일반 IEnumerable <T>을 IEnumerable <MoreSpecificT>으로 캐스팅해야합니까?
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
일 수 있습니다.
typeof(KSMoveComponent)
에 맵 List<KSComponent>()
에 : 내가 가진 상황은 위의 코드에서있는 클래스는 예를 들어, 그래서 특정 유형에 대한 KSComponent
의 목록을 보유하고 있다는 점이다. 목록의 모든 요소는 실제로 KSMoveComponent
유형입니다. 그래서 나는이 List<KSComponent>
이 Linq.Cast()
확장자를 사용하는 대신 직접 List<KSMoveComponent>
으로 캐스팅되고 있습니다 싶습니다.
그것은 질문에 내려오고 : 나는 자동차의 목록을 가지고 있고 100 %가 될 수 있는지 모두가 메르세데스 - 왜 다음 메르세데스의 목록을 얻을 수없는 이유는 무엇입니까? :-)
내 질문을 편집했습니다. 공분산이 그 사건과 아무 관련이없는 것 같습니다. – Krumelur
아직도 내가'GetComponentsByType()'라고 부르는 경우 작동하지 않을? 이제 IEnumerable 을 IEnumerable 로 캐스팅하려고합니다. ** IEnumerable 의 각 멤버 **가 'MySuperDuperSpecificImplementationOfKSComponent' 유형의 컴파일러 **를 어떻게 보장 할 수 있습니까? –
Alwyn
그럴 수는 없으므로 명시 적 형변환을 사용하려고합니다. 그것은 나를 신뢰해야하고 물론 캐스트가 실패 할 수 있습니다. 결국 Linq.Cast()를 사용할 수 있습니다. –
Krumelur