C#中嵌套泛型的问题

时间:2013-10-07 22:33:17

标签: c# generics

我有这些定义:

public interface IHasId
{
    string Id { get; set; }
}


public class Something : IHasId
{
    public string Id { get; set; }
}


public class Queueable<T>
    where T : IHasId, new()
{
    public T Item { get; set; }
    public int QueueId { get; set; }
}


public class Queue<T>       
    where T : Queueable<T>, IHasId, new()
{
    public void Enqueue(T item)
    {

    }

    public T Dequeue()
    {
        return default(T);
    }
}


public class QueueService
{
    private Queue<Queueable<Something>> queue;
    //private Queue<Queueable<SomethingElse>> somethingElseQueue;
}

当我编译这个时,我遇到了这些错误:

**Error**: The type 'test.Queueable<test.Something>' cannot be used as type parameter 'T' in the generic type or method 'test.Queue<T>'. There is no implicit reference conversion from 'test.Queueable<test.Something>' to 'test.IHasId'.

**Error**: The type 'test.Queueable<test.Something>' cannot be used as type parameter 'T' in the generic type or method 'test.Queue<T>'. There is no implicit reference conversion from 'test.Queueable<test.Something>' to 'test.Queueable<test.Queueable<test.Something>>'.

这是限制问题吗? 我正在考虑为Queue类使用2种类型,一种用于实现IHasId,另一种用于Queueable,但我希望这实际上更容易解决。

思考?

提前致谢! R上。

2 个答案:

答案 0 :(得分:3)

如果我正确理解你的意图,你想要这个:

public class Queue<T>       
    where T : IHasId, new()
{
    public void Enqueue(Queueable<T> item)
    {
    }

    public Queueable<T> Dequeue()
    {
        return default(Queueable<T>);
    }
}

或者:

public class Queue<TItem, TQueueable>   
    where TItem : IHasId, new()
    where TQueueable: Queueable<TItem>
{
    public void Enqueue(TQueueable<TItem> item)
    {
    }

    public TQueueable<TItem> Dequeue()
    {
        return default(TQueueable<TItem>);
    }
}

最后一个是可能的灵活后形式。

答案 1 :(得分:1)

public class Queue<T>       
    where T : Queueable<T>, IHasId, new()
{ ... }

正如您所看到的,T内的Queue<T>必须同时属于IHasIdQueueable<T>,但您输入的类型Queueable<Something>不是“T

您还需要在IHasId类型上同时实施Queueable<>Queueable<T>。请注意,您可能会为T以外的泛型类型引入更多名称,以防止出现某些递归要求。