为什么我不能在接口中放置委托?为什么我不能将委托添加到我的界面?您可以使用以下任何一项:publicdelegatedoubleCustomerDelegate(inttest);公共接口ITest{EventHandlerMyHandler{get;set;}CustomerDelegateHandlerWithCustomDelegate{get;放;}事件EventHandlerMyEvent;委托只是另一种类型,所以将它放在接口中不会有任何好处。您不需要创建自己的代理。大多数时候,您应该只使用EventHandler、Func、Predicate或Action。你的代表长什么样?委托是一种不能在接口中声明的类型。您可能希望使用事件(如果适用)或在接口外部但在同一命名空间中声明委托。此链接可能有帮助-何时使用委托而不是接口这是委托类型声明...publicdelegatereturntypeMyDelegateType(params)这不能在接口中声明,因为它是类型声明,但使用上述类型声明你可以使用委托实例MyDelegateTypeMyDelegateInstance(get;set;)所以委托实例是可以的,但委托类型声明不是(在接口中)文档明确指出你可以在接口中定义委托:接口只包含方法、委托或事件的签名。MSDN:Interfaces(C#Reference)但是,在同一页的注释中,它表示接口可以包含方法、属性、索引器和事件的签名。如果您尝试将委托放入接口中,编译器会说“接口无法声明类型”。Ecma-334标准(8.9接口)同意该页面和编译器的说明。正如其他人提到的,您只能在接口之外定义委托。使用委托几乎没有错。我个人的看法是Func比使用委托更糟糕:你不能命名参数,所以参数的含义可能会模棱两可老消息说事件不是线程安全的,所以下面的代码并不理想:if(MyFuncEvent!=null){MyFuncEvent(42,42.42);参见:http://kristofverbiest.blogspot.com/2006/08/better-way-to-raise-events.html比较安全的代码是:MyFuncEventHandlerhandler=MyFuncEvent;如果(处理程序!=null){处理程序(42,42.42);如果您想将事件保存到变量中,则必须复制事件的签名(或者您可以使用我不喜欢的var)。如果你有很多参数,这会变得非常乏味(同样,你总是可以偷懒并使用var)。函数处理程序=MyFuncEvent;如果(处理程序!=null){处理程序(42、42.42、...);代理使您不必在每次要将其分配给变量类型时都复制方法/事件的签名。接口方法可以接受委托作为参数,没问题。(也许我没有看到问题?)但是如果您打算在界面中指定出站调用,请使用事件。有很多细节,只显示一些代码而不是试图用散文来描述它们要容易得多。(对不起,即使代码示例有点臃肿...)以上是C#学习教程:为什么不能在接口中放置委托?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注—namespaceDelegatesAndEvents{publicclassMyEventArgs:EventArgs{publicstringMessage{get;放;}publicMyEventArgs(stringmessage){Message=message;}}委托voidTwoWayCallback(stringmessage);委托voidTwoWayEventHandler(对象发送者,MyEventArgseventArgs);接口ITwoWay{voidCallThis(TwoWayCallback回调);无效触发器(字符串消息);事件TwoWayEventHandlerTwoWayEvent;}classTalkative:ITwoWay{publicvoidCallThis(TwoWayCallbackcallback){callback("Delegateinvoked.");}publicvoidTrigger(stringmessage){TwoWayEvent.Invoke(this,newMyEventArgs(message));公共事件TwoWayEventHandlerTwoWayclassEvent;程序{publicstaticvoidMyCallback(stringmessage){Console.WriteLine(message);}publicstaticvoidOnMyEvent(objectsender,MyEventArgseventArgs){Console.WriteLine(eventArgs.Message);}staticvoidMain(string[]args){Talkativetalkative=newTalkative();健谈的.CallThis(MyCallback);talkative.TwoWayEvent+=newTwoWayEventHandler(OnMyEvent);talkative.Trigger("此消息触发事件。");控制台.ReadKey();}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
