我想维护代表列表(这里是:“mCommandHandlers”)。因为他们是普通的代表,其实我定义的第二种类型的代表,这样我可以保持这样的名单:使用通用代理类型的委托类型和协方差
public delegate void CommandHandler<TCommand>(TCommand command) where TCommand : ICommand;
public delegate void ICommandHandler(ICommand command);
Dictionary<Type, ICommandHandler> mCommandHandlers;
我会用编译时的优势,比如了解究竟是什么样的第一类我委托的实现正在使用TCommand:
RegisterHandler<ResourceCommand>((command) =>
{
if (command != null)
{
ResourceManager.ResourceReceived(command.ResourceName, command.ResourceHash, command.ResourceData);
}
});
里面RegisterHandler,我现在想做到以下几点:
public void RegisterHandler<TCommand>(CommandHandler<TCommand> handler) where TCommand : ICommand
{
mCommandHandlers.Add(typeof(TCommand), handler);
}
,但我得到了以下电子RROR消息:
错误3参数2:不能转换从
CommandHandler<TCommand>'
到'ICommandHandler'
这是为什么?编译器是否应该看到实际上我的第一个委托类型要求参数至少是ICommand类型的,确保委托实例也符合第二个委托类型的签名?
我现在看到我是如何彻底改变协方差的想法的错误方式:)。我的具体代表不能坐在等待接受任何类型的ICommand,因为他们应该是mCommandHandlers的一部分。感谢您指出了这一点! – user1610325