我有这些定义:
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上。
答案 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>
必须同时属于IHasId
和Queueable<T>
,但您输入的类型Queueable<Something>
不是“T
您还需要在IHasId
类型上同时实施Queueable<>
和Queueable<T>
。请注意,您可能会为T
以外的泛型类型引入更多名称,以防止出现某些递归要求。