Предположим, у меня есть следующий код:Не похоже, чтобы получить Generic ковариации/контрвариация работать
public interface IBaseMessage { }
public interface IMessageProcessor<in T> where T : IBaseMessage {
void Process(T msg);
}
public class RRMessage : IBaseMessage {
//something here
}
public class BaseMessageProcessor {
//something here
}
public class RRMessageProcessor : BaseMessageProcessor, IMessageProcessor<RRMessage> {
public void Process(RRMessage msg) {
Console.WriteLine("Processed RRMessage");
}
}
public Dictionary<Type, IMessageProcessor<IBaseMessage>> MessageProcessors = new Dictionary<Type, IMessageProcessor<IBaseMessage>>();
[Test]
public void Test1() {
var msgProcessor = new RRMessageProcessor();
MessageProcessors.Add(typeof(RRMessage), msgProcessor);
}
Я позволил контравариации для интерфейса IMessageProcessor. Почему MessageProcessors.Add(typeof(RRMessage), msgProcessor);
причина компиляции ошибки времени:
Argument 2: cannot convert from 'RRMessageProcessor' to 'IMessageProcessor<IBaseMessage>'
Похоже, он должен быть в состоянии преобразовать, потому что RRMessageProcessor:IMessageProcessor<RRMessage:IBaseMessage>>
Как я могу получить эту работу?
'' IMessageProcessor контравариантен в 'Т *, так что вы можете назначить только' 'IMessageProcessor Ань' 'IMessageProcessor для некоторого подтипа' 'TSub' из RRMessage'. Преобразование, которое вы хотите, будет небезопасным, поскольку оно позволит вам вызывать 'RRMessageProcessor.Process (new BaseMessage())', когда для этого требуется параметр «RRMessage». –
Lee
Как бы вы переписали это? – Denis
@Denis Лучшее, что вы можете сделать здесь, это сделать свою словари «Словарь <Тип, BaseMessageProcessor>». – juharr