我被困住了,为什么这不起作用:
var childAction = new Action<CancelCommand>(blabla);
Action<IDomainCommand> upperAction = (Action<IDomainCommand>) childAction;
如果 CancelCommand 实现 IDomainCommand,为什么这不起作用?
顺便说一句:这是我在这里想做的协变还是逆变? ;)
先感谢您
就是最好的
劳林
EDIT感谢你们的快速回复!
我需要这个的问题是因为我构建了一个通用的操作模板。
我有以下界面:
IMessageBus.RegisterAction<T>(Action<T> registerAction) where T : IDomainCommand
因为我必须在运行时构建此操作,所以我的代码如下所示:
var genericExecuteAction = this.GetType().GetMethod("ExecuteCommandAction",
BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(commandType);
var actionType = typeof(Action<>).MakeGenericType(commandType);
var @delegate = Delegate.CreateDelegate(actionType, this, genericExecuteAction);
var actionDelegate = (Action<DomainCommandBase>)@delegate;
messageBus.Register(actionDelegate);
问题是我需要转换它,以便我可以将它传递给这个方法。
你看?
我们使用的消息总线背后是使用 RX,不幸的是,那里的所有方法都使用泛型,现在有非泛型重载。
的类型参数Action
是逆变的:您可以分配一个Action<object>
to an Action<string>
因为显然可以作用于任何对象的方法也可以作用于字符串。
您在这里所做的就是尝试对适用于CancelCommand
(派生类型)作为适用于任何IDomainCommand
(基本类型)。这在逻辑上是错误的,所以编译器不会让你这样做——如果是的话,你可以调用upperAction
通过它DifferentTypeOfDomainCommand
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)