【发布时间】:2023-03-14 10:20:02
【问题描述】:
我有一段这样的代码:
var senders = new List<MessageSenderBase<object>>();
senders.Add(new MessageSender1<MessageType1>());
其中MessageSender1<MessageType1> 派生自MessageSenderBase<T> 而MessageType1 是我定义的另一个类。
现在第二行有错误,上面写着CS1503 Argument 1: cannot convert from 'Demo.MessageSender.MessageSender1<Demo.MessageSender.MessageType1>' to 'Demo.MessageSender.MessageSenderBase<object>'
我该如何解决这个问题?
我的设计是MessageSenderBase<T> 将位于我的库中,并且在 API 级别,用户可以派生自己的发件人类并指定他们自己想要发送的消息类型。我认为这会起作用,因为object 是MessageType1 的基类,而MessageSenderBase<> 是MessageSender1<> 的基类。
请帮忙,谢谢!
编辑 - 添加 MessageSenderBase
public class MessageSender1<MessageType1> : MessageSenderBase<MessageType1>
{
public override string Topic => "topic1";
public async override Task SendAsync()
{
//...
}
}
public abstract class MessageSenderBase<T>
{
public abstract string Topic { get;}
public T Deserialize(string json)
{
return JsonConvert.DeserializeObject<T>(json);
}
public abstract Task SendAsync();
}
【问题讨论】:
-
你能展示一下你的
MessageSenderBase类是什么样的吗?从MessageSender1<MessageType1>到MessageSender1<object>的转换可能有意义,也可能没有意义。 -
@Sweeper 请看我最近的编辑,谢谢!
-
这是一个编译时静态类型错误。此时运行时无关紧要。
-
如果
MessageSenderBase<T>只有你展示的那个方法,你可以把它做成covariant接口,然后转换就可以了。 -
@Sweeper 谢谢,如果我的课堂上有一些实现,它会起作用吗?请参阅我最近的编辑。我无法将其标记为接口。
标签: c# .net generics polymorphism