2012-02-13 2 views
2

주어진 다음의 클래스 계층 구조 :는 공분산, contravariance 및 제거 불필요한 유형의 매개 변수

void Create<TD>(string description) 
    where TD : D 
{ 
    var instance = Activator.CreateInstance<TD>(); 
} 

그러나 컴파일러 :

abstract class A { } 
abstract class B { } 
abstract class C { } 
abstract class D<TA, TB, TC> 
    where TA : A 
    where TB : B 
    where TC : C { } 

class E : A { } 
class F : B { } 
class G : C { } 
class H : D<E, F, G> { } 

내가 유형 D의 개체를 인스턴스화하는 간단한 일반적인 방법을 만들려면 따라서 D에 대한 유형 매개 변수를 지정해야하므로 다음을 작성해야합니다.

void Create<TD, TA, TB, TC>(string description) 
    where TA : A 
    where TB : B 
    where TC : C 
    where TD : D<TA, TB, TC> 
{ 
    var instance = Activator.CreateInstance<D>(); 
} 
대신

Create<H>("foo"); 

을 쓸 수 있다는 내가 가진 내 질문은

Create<H, E, F, G>("foo"); 

를 작성하는 것을 의미

: 나는 구체적인 인스턴스로 H를 지정하고 있습니다 때문에, 왜 컴파일러가 필요합니까 메소드 서명의 기본 클래스 D에 대한 추가 유형 매개 변수는 무엇입니까? 왜 그들은 단지 H에서 그 사람들을 추론 할 수 없습니까?

+0

"TL : List"는 "TL"이 일부 닫힌'List <>'인 것을 말할 수 있다고 기대하겠습니까? – AakashM

답변

2

where TD : D은 D가 일반적이지 않음을 의미합니다. 여기서, TD : D<TA, TB, TC>은 D가 제네릭임을 의미합니다.

관련 문제