3

我有这些定义:

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。

4

2 回答 2

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>);
    }
}

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

于 2013-10-07T22:41:55.797 回答
1
public class Queue<T>       
    where T : Queueable<T>, IHasId, new()
{ ... }

如您所见,TinsideQueue<T>必须是 of IHasIdQueueable<T>但您输入的类型Queueable<Something>, 不是。

您还需要在类型IHasId上实现两者。请注意,您可能会为泛型类型引入更多名称,而不是为了防止某些递归要求或其他东西。Queueable<>Queueable<T>T

于 2013-10-07T22:39:19.483 回答