无法将新实例添加到泛型类中的泛型列表.为什么
本文关键字:泛型类 泛型 为什么 列表 添加 新实例 实例 | 更新日期: 2023-09-27 18:37:03
>我有以下泛型类:
public class MessageProcesser<T> where T : Message
在代码中,我有以下属性:
private readonly BlockingCollection<T> _messages;
当我尝试这样做时,我收到一个错误(由于 T 是一条消息,所以应该是可能的):
_messages.Add(new Message(MessageType.Stop));
怎么了?
谢谢!
您没有消息集合。消息不能是 T,因为 T 可能是继承的。
尝试
private readonly BlockingCollection<Message> _messages;
编译器
错误是您假设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
传递给MessageProcessor
,并将创造责任抽象给工厂。