匿名方法与委托我想弄明白为什么BeginInvoke方法不接受匿名方法。voidbgWorker_ProgressChanged(objectsender,ProgressChangedEventArgse){if(InvokeRequired){//不会编译BeginInvoke(delegate(objectsender,ProgressChangedEventArgse){bgWorker_ProgressChanged(sender,e);});}progressBar1.Increment(eage.Progress);它告诉我'无法从'匿名方法'转换为'System.Delegate',当我将匿名方法转换为委托时,它是否有效?BeginInvoke((progressDelegate)delegate{bgWorker_ProgressChanged(sender,e);});委托类是委托类型的基类。但是,只有系统和编译器可以显式派生自Delegate类或MulticastDelegate类。也不允许从委托类型派生新类型。Delegate类不被视为委托类型;它是一个用于派生委托类型的类。来源-MSDN因此需要显式转换为从委托派生的类型。当您向匿名方法传递类型为System.Delegate的参数时,您会收到此特定的编译器错误-幸运的是,这种情况很少见。这太灵活了。委托voidMyDelegate();staticvoidDoSomething_Flexible(Delegated){d.DynamicInvoke();}staticvoidDoSomething_Usable(MyDelegated){d();}staticvoidMain(string[]args){//需要显式转换else编译错误错误“无法将匿名方法转换为类型‘System.Delegate’,因为它不是委托类型DoSomething_Flexible((MyDelegate)delegate{Console.WriteLine("Flexibleishere!");});//ParameterType是一个.NETDelegate,这里不需要显式转换。DoSomething_Usable(delegate{Console.WriteLine("Usableishere!");});}更多相关信息IanGriffith的页面。(请参阅注释标题后的段落)您需要告诉编译器要创建什么类型的委托,因为调用(等)只需要使用委托(而不是更具体的东西)。要应用于最大的受众,MethodInvoker是一个方便的委托类型BeginInvoke((MethodInvoker)delegate(...){...});但是...BackgroundWorker.ProgressChanged会自动触发UI线程-所以你甚至不需要做this。大多数时候,在这些情况下,您正在处理无参数委托或谓词。最简单的方法是分别将匿名方法直接转换为Action或Predicate;您只需要为这样的简单事情创建自定义委托类型。所以你会有类似BeginInvoke((Action)delegate(){YourCode.DoSomething();});或BeginInvoke((Predicate)delegate(objectyourParameter){returnYourCode.IsTheParameterSomething(yourParameter)});HTH以上为C#学习教程:匿名方法及代表分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
