2010-06-14 6 views
1

동료 중 한 명은 내부 포럼에 질문을 게시하여 C#을 통해 가능했는지 여부를 생각해 보았습니다. 다음과 같이 기본적으로, 그는 인터페이스를 가지고 :내부 유형에 대한 액세스

public interface IProvider<T> 
{ 
    T GetT(); 
} 

가 다른 일반적인 클래스 타입의 매개 변수로 해당 인터페이스를 구현하는 것을 사용하고 다시 지정하지 않고 타입 T에 액세스 할 수 있습니까? 예 : T 형이 정의되어 있지 않기 때문에

public class Foo<P> where P : IProvider<T> 
{ 
    P p; 

    T GetInnerT() { return p.GetT(); } 
} 

이것은 컴파일하지 않고, 따라서 IProvider위한 파라미터로 사용될 수 없다. 이 같은 것이 가능한가? 그냥 궁금해서! -이 선언의 일부는 사실

public class Foo<P, T> where P : IProvider<T> 

달리 인식하는 IProvider<T> 제약에 대한 T가 없습니다 :

답변

6

아니, 모두 P T에서 일반적으로 Foo 필요 했어 IProvider<T>은 우연입니다. 위의 선언에있는 TTIProvider<T>에서 완전히 구분됩니다 (컴파일러의 관점에서). 예를 들어,이 동등한 선언 될 것이다 :

public class Foo<TProvider, TProvided> where TProvider : IProvider<TProvided> 

또 다른 명심하는 것은 IProvider<T>의 구현이 다른 형태 인수를 들어, 여러 번을 구현할 수 있다는 것입니다 :

public class BigProvider : IProvider<string>, IProvider<int>, IProvider<char> 

이제 어떻게 것 Foo<BigProvider>? 그것은 위의 내 선언 반면에, 당신이 할 것 ... 모호한 것 :

var x = new Foo<BigProvider, int>(); 

BigProvider의 INT-제공하는 측면을 의미 할 수 있습니다.

2

Foo을 선언 할 때 정의가 유형이 T 인 조항을 허용하지 않으므로 불가능합니다. 고려 :

var x = new Foo<string>(); 

이 경우 T 무엇입니까? 컴파일 타임이나 런타임에 알 수있는 방법이 없습니다.

귀하가 직접 말씀 드린대로 : 유형 T은 정의되지 않았으며 클래스가 유효하려면 정의 방법을 제공해야합니다. 예 :

public class Foo<P, T> where P : IProvider<T> 
관련 문제