无法将新实例添加到泛型类中的泛型列表.为什么

本文关键字:泛型类 泛型 为什么 列表 添加 新实例 实例 | 更新日期: 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,并将创造责任抽象给工厂。