当前位置: 首页 > 编程语言 > C#

ActionRepresentatives的CovarianceandContravariance分享

时间:2023-04-10 17:02:31 C#

ActionRepresentatives的CovarianceandContravariance动作upperAction=(Action)childAction;如果CancelCommand实现了IDomainCommand,为什么它不起作用?顺便说一句:我在这里想做什么,这是合作还是倒置?;)提前感谢最好的劳伦编辑感谢您的快速回复!我需要这个的问题是因为我构建了一个通用的操作模板。我有以下接口:IMessageBus.RegisterAction(ActionregisterAction)whereT:IDomainCommand因为我必须在运行时构建这个动作,所以我的代码如下所示:vargenericExecuteAction=this.GetType().GetMethod("ExecuteCommandAction",BindingFlags。NonPublic|BindingFlags.Instance).MakeGenericMethod(commandType);varactionType=typeof(Action).MakeGenericType(commandType);var@delegate=Delegate.CreateDelegate(actionType,this,genericExecuteAction);varactionDelegate=(Action)@delegate;messageBus.Register(actionDelegate);问题是我需要转换它以便我可以将它传递给这个方法。看?在我们使用的消息总线后面使用RX,不幸的是那里的所有方法都使用泛型,现在有非泛型重载。Action的类型参数是逆变的:您可以将Action分配给Action,因为显然适用于任何对象的方法也适用于字符串。您在这里所做的是试图找出一种适用于CancelCommand(派生类型)的方法,就像适用于任何IDomainCommand(基类型)的方法一样。这在逻辑上是错误的,因此编译器不允许您这样做-如果是这样,您可以调用upperAction传递DifferentTypeOfDomainCommand。这就是逆转。这是行不通的,因为如果可以的话,您可以这样写:interfaceIDomainCommand{}classCancelCommand:IDomainCommand{}行动a2=a1;varacceptCommand=newAcceptCommand();a2(接受命令);//什么???a2指向a1,a1不能接受AcceptCommand参数,因为它不是CancelCommand。等一下,你为什么要这个?您的childAction接受CancelCommand并用它做一些事情。但是可以在任何IDomainCommand上调用IDomainCommand,而不仅仅是CancelCommand。假设以上编译;当我执行upperAction(newEditCommand());时我应该做什么?类EditCommand:IDomainCommand?如果您尝试分配:varupperAction=newAction(idc=>{});动作childAction=upperAction;它有效,你甚至不需要演员表。任何动作都算作一个动作。您忘记了如何使用这些委托varchildAction=newAction(blabla);ActionupperAction=(Action)childAction;意味着稍后将调用IDomainCommand,传递某种形式的IDomainCommand对象。你给它一个只能处理CancelCommand对象的函数。但是(可能)其他类实现了IDomainCommand,并且upperAction可能会被其中任何一个调用。以上就是C#学习教程的全部内容:动作代表的协方差和逆方差。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: