我想维护一个代表列表(这里:“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);
}
但我收到以下错误消息:
错误 3 参数 2:无法转换
CommandHandler<TCommand>'
为'ICommandHandler'
为什么是这样?编译器是否应该看到事实上我的第一个委托类型要求参数至少是 ICommand 类型,以确保委托实例也符合第二个委托类型的签名?