2013-10-07 23 views
3

嵌套泛型我有這方面的定義:問題在C#

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類的兩個類型,一個用於實現IHasId,另一個用於Queueable,但我希望這實際上更容易解決。

想法?

在此先感謝! R.

+2

是否有'隊列'丟失? – usr

+0

你能告訴我們'Queue '類的代碼嗎? –

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

最後一個是後靈活的形式成爲可能。

+0

我想你釘了它。咄!謝謝!試試這個 –

+0

我想出了類似於你所建議的第二種選擇(因此我的評論是關於接受問題中的2種類型),但第一個建議實際上更有意義,因爲解決了我的問題。謝謝! –

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

正如你所看到的,TQueue<T>需要是兩者的IHasIdQueueable<T>但你把類型,Queueable<Something>,是不是。

您需要在Queueable<T>類型上同時實現IHasIdQueueable<>。請注意,您可能會爲T之外的其他泛型類型引入更多名稱,以防止出現某些遞歸要求。

+0

我沒跟着。某些東西實現了IHasId,而Queueable 符合這兩個要求。我錯過了什麼? –

+2

「有些東西」確實存在,但不是那些根據您的約束需要的東西。 –

+2

In'隊列>'隊列'的'T'是'Queueable ',約束條件是'T:Queueable ,IHasId'。如果你想擴大這個範圍,就會像'Queueable :Queueable >,IHasId'。我甚至不確定這是否真的有意義。你應該檢查你的約束。 – poke