2

私は次のジェネリッククラスを持っています:

public class MessageProcesser<T> where T : Message

コード内には、次の属性があります。

private readonly BlockingCollection<T> _messages;

これを実行しようとすると、エラーが発生します(Tはメッセージであるため、可能であるはずです)。

_messages.Add(new Message(MessageType.Stop));

どうしたの?

ありがとう!

4

2 に答える 2

4

メッセージのコレクションがありません。Tが継承されている可能性があるため、メッセージをTにすることはできません。

試す

private readonly BlockingCollection<Message> _messages;
于 2012-06-14T07:48:32.397 に答える
3

コンパイラ エラーは、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);

引数を使用してコンストラクターを制約することはできないため、現在のコンストラクターの使用はサポートされませんMessageFactoryこれを回避する方法は、aをに渡し、作成の責任をファクトリにMessageProcessor抽象化することです。

于 2012-06-14T07:55:44.623 に答える