C# 泛型类型参数

C# 泛型类型参数,c#,generics,C#,Generics,请解释为什么这不起作用?编译器不喜欢的约束是什么?是因为泛型IPoolable实际上只是一个“模板”,而且PoolItem和IPoolable之间没有继承关系吗 在代码中 public class GenericPool<TPoolable> where TPoolable : IPoolable<T> 说清楚一点,我知道我可以将GenericPool更改为 public class GenericPool<TPoolable, T> where TPool

请解释为什么这不起作用?编译器不喜欢的约束是什么?是因为泛型
IPoolable
实际上只是一个“模板”,而且
PoolItem
IPoolable
之间没有继承关系吗

在代码中

public class GenericPool<TPoolable> where TPoolable : IPoolable<T>
说清楚一点,我知道我可以将GenericPool更改为

public class GenericPool<TPoolable, T> where TPoolable : IPoolable<T> where T : new()
公共类泛型池,其中TPoolable:IPoolable,其中T:new()

我不是在问如何修复这个代码。相反,我在问这个问题;为什么我必须首先将T作为类型参数添加到GenericPool中?

您不能使用
IPoolable
作为约束,因为该上下文中不知道泛型类型参数
T
。正如您所猜测的,
IPoolable
本质上是无限多类型的蓝图,因此如果不将
T
绑定到某个对象(例如,
GenericPool
类的类型参数),它就没有意义成为约束


您应该得到的实际错误消息是,
找不到类型或命名空间名称“T”
,这很有意义:
T
没有在任何地方定义。

我知道T在GenericPool类中“没有定义”,但定义了IPoolable。为什么我必须定义两次T呢?
IPoolable
中的
T
只与接口本身的声明相关。除此之外,
IPoolable
必须在
之间声明实际类型和有效类型参数的组合(除了
typeof(IPoolable)
)。因为
T
既不是有效的类型,也不是当前可用的类型参数,所以您没有有效的代码。否,
i可编程的
也没有定义,因为编译器不知道
T
是什么。唯一定义的是泛型
IPoolable
接口,在实例化之前应该用类型参数化它。
public class GenericPool<TPoolable, T> where TPoolable : IPoolable<T> where T : new()