이것이 작동하지 않는 이유를 설명해주십시오. 컴파일러가 좋아하지 않는 제약 IPoolable<T>
에 대해서는 무엇입니까? 일반 IPoolable<T>
은 실제로 "템플릿"이며 PoolItem
과 IPollable<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에 추가해야합니까?
GenericPool 클래스에는 T가 정의되어 있지 않지만 IPoolable이 정의되어 있음을 이해합니다. 왜 T를 두 번 정의해야합니까? –
'IPoolable'의'T'는 인터페이스 자체의 선언에만 관련이 있습니다. 그 외에,'IPoolable <>'은 실제 타입과 유효한 타입 파라미터의 조합으로 '<' and the '>'('typeof (IPoolable <>)'을 제외하고는) 선언되어야한다. 'T'는 유효한 타입도 아니고 현재 사용할 수있는 타입 인자도 아니기 때문에 유효한 코드를 가지고 있지 않습니다. –
dlev
아니요,'IPoolable'도 정의되어 있지 않습니다. 왜냐하면 컴파일러는'T '가 무엇인지 알지 못하기 때문입니다. 정의되는 유일한 것은 일반적인'IPoolable' 인터페이스입니다.이 인터페이스는 인스턴스화 전에 유형으로 매개 변수화되어야합니다. –
Grozz