2011-06-23 34 views
3

我試圖創建一個類接受例如兩個泛型類型(IQueue,的iItem):類中的通用項目的通用集合?

public class Coordinator<T,K> 
    where T : IQueue<K> 
    where K : IItem 
{ 
    private T<K> collection = new T<K>(); 
} 

其中:

public interface IQueue<T> where T : IItem 
{ 
} 

public class MyQueue<T> : IQueue<T> 
    where T : IItem 
{ 
} 

但是,編譯器不喜歡:

private T<K> collection = new T<K>(); 

這是可能的嗎?

謝謝!

+0

激活仍可能是一個很好的部分答案,但它不工作了,只是還沒有。 =)對於已刪除的答案太糟糕了。 – Marnix

回答

3

我認爲你需要做到以下幾點:因爲你說

public interface IQueue<T> where T : IItem 
{ 
} 

public class MyQueue<T> : IQueue<T> 
    where T : IItem 
{ 
} 

:協調得到一個IQueue,但你正在試圖構建更具體的信息myQueue中。

使用已經討論Activator,你可以做到這一點沒有編譯器錯誤:

class Coordinator <T,K> 
    where T : IQueue<K> 
    where K : IItem 
{ 
    private T collection = (T)Activator.CreateInstance(typeof(T)); 
} 
+0

我有: private T collection =(T)Activator.CreateInstance (); 但他們都工作!謝謝:) – adamwtiko

0

我想你可能會認爲在「其中T:IQueue其中K:的iItem」有一個序列,但它實際上需要明確定義現在。這將是一個很好的功能,如果這在未來仍然有效。直覺上你問的事情對我有意義。

這裏有一個建議的方法來處理它。

public class Coordinator<T> where T : IQueue<T>, new() 
{ 
    private T collection = new T(); 
} 
public interface IQueue<T>{} 
public interface IItem{} 
+0

如果你可以像我嘗試的那樣對它們進行「排序」,它會更具可讀性,但是我想你說的話對我們所擁有的是有意義的。 – adamwtiko

+0

在此鍵入,然後走開找到上述相同的答案。 btw:「(T)Activator.CreateInstance(typeof(T));」是一個很好的接觸。 – sgtz

+0

[編輯]:在where子句中查看上面的new()。這可以讓你避免激活。 – sgtz