请解释为什么这不起作用?什么是编译器不喜欢的约束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>();
}
}
为了清楚起见,我知道我可以将GenericPool更改为
public class GenericPool<TPoolable, T> where TPoolable : IPoolable<T> where T : new()
我不是在问如何修复此代码。相反,我在问这个问题;为什么我必须首先将T作为类型参数添加到GenericPool?
答案 0 :(得分:3)
您不能将IPoolable<T>
用作约束,因为在该上下文中不知道泛型类型参数T
。正如您所推测的,IPoolable<T>
本质上是无数类型的蓝图,因此无需将T
绑定到某些(例如,{{1}的类型参数} class)作为约束没有意义。
您应该获得的实际错误消息是GenericPool
,这是有道理的:The type or namespace name 'T' could not be found
未在任何地方定义。