2011-09-29 5 views
1

실패 나는 IBarinterface을 구현 Tclass 있습니다.목록 <T> 주조 ICollection에 <IBar>에이

List<T>의 변수 list이 있습니다. 언어에 대한 이해를 향상

두 질문 :

  • 하지 않는 이유는이 작품?

    var foo = (ICollection <IBar>)list; // fails!

  • 어떻게 (가능한 경우)를 해결하기 위해?

+2

.net 4를 사용하고 있습니까? –

+0

아니요, .NET 3.5입니다. –

답변

5

왜이 작품?

var foo = (ICollection <IBar>)list;이의이 T = Foo 말을하자 두 번째 클래스 Foo2 : IBar 거기를하지 않습니다.

은 그럼 당신은 이런 식으로 계속할 수 :

var foolist = (ICollection <IBar>)list; 
foolist.Add(new Foo2()); // compiles, since Foo2 also implements IBar 

왬을! List<Foo>Foo2을 추가하려고 했으므로 런타임에 유형 위반이 있습니다. 이 문제를 방지하려면

ICollection<Foo>FooIBar의 서브 타입 임에도 불구하고,하지 ICollection<IBar>의 하위 유형 이다. 이 이론의 배경은 co- and contravariance입니다.

관련 문제