2009-06-04 7 views
0

다음 코드가 주어집니다.Generics : 왜 컴파일되지 않습니까?

class A<T> 
{ 
    internal void Add(T obj) { } 
} 

class C { } 

class B<T> where T : C 
{ 
    public B() 
    { 
    A<T> a = new A<T>(); 
    a.Add(new C()); 
    } 
} 

Add 호출이 컴파일되지 않습니다.

수면 부족 일 수도 있지만 여기에 무엇을 놓치고 있습니까?

T TC 유형 인 경우 ( B에 대한 제한 사항에 유의하십시오), 그러면 A<T>A<C>과 동등한 이유는 무엇입니까?

답변

4

B는 D의 유형으로 선언 된 경우 때문에 , 이는 C를 확장하는 클래스가 될 것이고, 새로운 C를 추가하면 그 타입을 위반하게 될 것입니다.

+0

고마워요, 저를 벗어났습니다. – JulianR

+1

내 마음이 공식적으로 날아갔습니다. :) –

+0

FYI의 –

3

T는

당신이 목록에 동물 밥 = 새로운 물고기()를 추가 할 수 없습니다 C.

의 하위 클래스가 될 수 있기 때문에 < 기린 >

2

A.Add()T이 필요합니다. 당신은 그것에게 C을주고 있습니다. 컴파일러가 CT이라는 것을 알고있는 한 괜찮습니다.

하지만 그건 제약 조건이 말하는 것이 아닙니다. TC이며 그 반대입니다.

+0

나는 당신의 설명을 Yishai 's보다 훨씬 더 쉽게 파싱 할 수 있다고 본다. – Brian

관련 문제