Suppose I have the following code:
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);
}
I enabled contravariance for the interface IMessageProcessor. Why does MessageProcessors.Add(typeof(RRMessage), msgProcessor);
cause a compile time error:
Argument 2: cannot convert from 'RRMessageProcessor' to 'IMessageProcessor<IBaseMessage>'
It seems like it should be able to convert because RRMessageProcessor:IMessageProcessor<RRMessage:IBaseMessage>>
How can I get this to work?