Предположим, у меня есть следующий интерфейс:Не удается преобразовать из реферата <Generic> в бетон: Аннотация <Бетон: Generic>
public interface IMessageProcessor<T> where T: BaseMessage {
void Process(T msg);
}
У меня есть абстрактный класс, который реализует этот интерфейс:
public abstract class AMessageProcessor<T> : IMessageProcessor<T> where T : BaseMessage {
protected Controller Controller { get; private set; }
public AMessageProcessor(Controller controller) {
Controller = controller;
}
public abstract void Process(T msg);
}
то у меня есть сообщение:
public class RRMessage : BaseMessage {
...
}
, а затем у меня есть реализация:
public class RRMessageProcessor : AMessageProcessor<RRMessage> {
public RRMessageProcessor(Controller controller) : base(controller) {}
public override void Process(RRMessage msg) {
//do something here
}
}
Теперь в другом классе я хотел бы сделать список этих процессоров для различных сообщений:
public readonly List<AMessageProcessor<BaseMessage>> AvailableMessageProcessors;
public MessageProcessingStrategy(Controller controller) {
AvailableMessageProcessors = new List<AMessageProcessor<BaseMessage>>();
/* ----- ERROR HAPPENS AT THIS LINE ------ */
AvailableMessageProcessors.Add(new RRMessageProcessor(controller));
}
И я получаю эту ошибку:
Error CS1503 Argument 1: cannot convert from 'RRMessageProcessor' to 'AMessageProcessor<BaseMessage>'
кажется, что конверсия должна работа ... Почему он не может его преобразовать? Как я могу заставить его работать?
Нет безопасного пути для этого. Если это разрешено, вы можете передать «BaseMessage» в «RRMessage.Process», для которого требуется параметр «RRMessage». – Lee