我有以下的通用類:無法將新實例添加到泛型類中的泛型列表。爲什麼?
public class MessageProcesser<T> where T : Message
我有以下屬性裏面的代碼:
當我嘗試這樣做,我得到一個錯誤(和T是一個消息時,它應該是可能的):
_messages.Add(new Message(MessageType.Stop));
怎麼了?
謝謝!
我有以下的通用類:無法將新實例添加到泛型類中的泛型列表。爲什麼?
public class MessageProcesser<T> where T : Message
我有以下屬性裏面的代碼:
當我嘗試這樣做,我得到一個錯誤(和T是一個消息時,它應該是可能的):
_messages.Add(new Message(MessageType.Stop));
怎麼了?
謝謝!
您沒有收集消息。消息不能是T,因爲T可能已被繼承。
嘗試
private readonly BlockingCollection<Message> _messages;
+1事實上,換句話說,儘管OP指出「哪裏T:消息」。 'T'可能是'DerivedMessage:Message',所以將'Message'添加到'BlockingCollection
謝謝,你是對的。 MessageProcessor應該處理消息,而不是T。 –
的編譯器錯誤的事實是,你承擔T
總是Message
。 T
可能是更衍生的類型,如DerivedMessage : Message
。這會使你的收藏BlockingCollection<DerivedMessage>
,試圖將Message
的實例設置爲這個無效。
如果要包含所有郵件列表無論哪種類型,所有你需要做的是:
private readonly BlockingCollection<Message> _messages;
而且完全刪除使用泛型。然後,您可以存儲Message
類型以及從Message
派生的任何類型。
如果你想擁有MessageProcessor<T>
處理任何信息,並存儲正確,相關類型,你總是可以使用new()
約束強制類型有公共的無參數構造:
public class MessageProcesser<T> where T : Message, new()
然後你可以或許做到這一點:
var message = new T();
message.MessageType = MessageType.Stop;
_messages.Add(message);
您不能合作nstrain在帶參數的構造函數上,所以你當前的構造函數使用不會被支持。一種方法是通過MessageFactory
到MessageProcessor
和摘要創建責任到工廠。
我也可以接受你的答案......頁面上的另一個更高:P –
@SoMoS完全由你決定,我不是f::-)我只是試圖補充他的答案進一步的細節。 –
你會得到什麼錯誤? – Tisho
爲什麼你需要這種泛型? –