通用类型参数

时间:2011-08-06 06:12:56

标签: c# generics

请解释为什么这不起作用?什么是编译器不喜欢的约束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>();
        }
    }

为了清楚起见,我知道我可以将GenericPool更改为

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

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

1 个答案:

答案 0 :(得分:3)

您不能将IPoolable<T>用作约束,因为在该上下文中不知道泛型类型参数T。正如您所推测的,IPoolable<T>本质上是无数类型的蓝图,因此无需将T绑定到某些(例如,{{1}的类型参数} class)作为约束没有意义。

您应该获得的实际错误消息是GenericPool,这是有道理的:The type or namespace name 'T' could not be found未在任何地方定义。