2013-02-15 2 views
2

나는 .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 %가 될 수 있는지 모두가 메르세데스 - 왜 다음 메르세데스의 목록을 얻을 수없는 이유는 무엇입니까? :-)

답변

1

공분산 당신은 그것의 더 일반적인 버전으로 열거 캐스트 할 수 있습니다.

반면에 일반 조건은 당신이 더 제한적인 뭔가 제네릭 타입을 대체 할 수 있습니다.

왜 그것은 작동합니다? 그들 중 2 명이 다른 방향으로 가고있는 것처럼 보입니다 - 아니요?

+0

내 질문을 편집했습니다. 공분산이 그 사건과 아무 관련이없는 것 같습니다. – Krumelur

+1

아직도 내가'GetComponentsByType ()'라고 부르는 경우 작동하지 않을? 이제 IEnumerable 을 IEnumerable 로 캐스팅하려고합니다. ** IEnumerable 의 각 멤버 **가 'MySuperDuperSpecificImplementationOfKSComponent' 유형의 컴파일러 **를 어떻게 보장 할 수 있습니까? – Alwyn

+0

그럴 수는 없으므로 명시 적 형변환을 사용하려고합니다. 그것은 나를 신뢰해야하고 물론 캐스트가 실패 할 수 있습니다. 결국 Linq.Cast ()를 사용할 수 있습니다. – Krumelur

관련 문제