2011-08-06 9 views
1

이것이 작동하지 않는 이유를 설명해주십시오. 컴파일러가 좋아하지 않는 제약 IPoolable<T>에 대해서는 무엇입니까? 일반 IPoolable<T>은 실제로 "템플릿"이며 PoolItemIPollable<T> 사이에 상속이 없기 때문에 가능합니까? 코드일반 유형 매개 변수

public class GenericPool<TPoolable> where TPoolable : IPoolable<T> 

동안

하지 T 오랫동안로 해석 될 수 있는가?

전체 코드 목록 :

public interface IPoolable<T> where T : new() 
    { 
     T PooledObject { get; } 
    } 

    public class PoolItem : IPoolable<long> 
    { 
     private readonly long _id; 

     public long PooledObject 
     { 
      get { return _id; } 
     } 
    } 

    public class GenericPool<TPoolable> where TPoolable : IPoolable<T> 
    { 
     public T Borrow() 
     { 
      var item = default(TPoolable); 
      return item.PooledObject; 
     } 

     public void Return(T item) 
     { 

     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var pool = new GenericPool<PoolItem>(); 
     } 
    } 

그냥 명확하게하기 위해, 나는 나는이 코드를 수정하는 방법을 요구하고 있지 않다

public class GenericPool<TPoolable, T> where TPoolable : IPoolable<T> where T : new() 

에 GenericPool을 변경할 수 있다는 것을 알고. 대신 나는 그 질문을하고있다. 왜 T를 유형 매개 변수로 GenericPool에 추가해야합니까?

답변

3

제네릭 형식 매개 변수 T은 해당 컨텍스트에서 알 수 없으므로 IPoolable<T>을 제약 조건으로 사용할 수 없습니다. 짐작할 수 있듯이 IPoolable<T>은 본질적으로 무한한 수의 유형에 대한 청사진이므로 T ~ 의 내용이 인 경우 (예 : GenericPool 클래스의 유형 매개 변수) 제약 조건으로 사용되지 않습니다.

실제 오류 메시지는 The type or namespace name 'T' could not be found입니다. 의미가 있습니다. T은 어디에도 정의되어 있지 않습니다.

+0

GenericPool 클래스에는 T가 정의되어 있지 않지만 IPoolable 이 정의되어 있음을 이해합니다. 왜 T를 두 번 정의해야합니까? –

+2

'IPoolable '의'T'는 인터페이스 자체의 선언에만 관련이 있습니다. 그 외에,'IPoolable <>'은 실제 타입과 유효한 타입 파라미터의 조합으로 '<' and the '>'('typeof (IPoolable <>)'을 제외하고는) 선언되어야한다. 'T'는 유효한 타입도 아니고 현재 사용할 수있는 타입 인자도 아니기 때문에 유효한 코드를 가지고 있지 않습니다. – dlev

+1

아니요,'IPoolable '도 정의되어 있지 않습니다. 왜냐하면 컴파일러는'T '가 무엇인지 알지 못하기 때문입니다. 정의되는 유일한 것은 일반적인'IPoolable' 인터페이스입니다.이 인터페이스는 인스턴스화 전에 유형으로 매개 변수화되어야합니다. – Grozz