首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# BeginInvoke问题

C# BeginInvoke问题
EN

Stack Overflow用户
提问于 2010-08-11 23:01:14
回答 2查看 816关注 0票数 6

为什么我会有这个错误,以及如何修复它。感谢你的帮助

错误4无法将lambda表达式转换为类型“”System.Delegate“”,因为它不是委托类型

代码语言:javascript
复制
    void provider_GetAssignmentsComplete(object sender, QP_Truck_Model.Providers.GetAssignmentsEventArgs e) {
        lvMyAssignments.Dispatcher.BeginInvoke(() =>
        {
            lvMyAssignments.ItemsSource = e.HandOverDocs;
        });
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-11 23:07:05

Lambda表达式在某些情况下不能隐式转换为委托。具体地说,如果该方法需要Delegate类型,则必须首先显式地强制转换lambda,以便编译器接受它。

您所能做的是显式地转换lambda,这应该允许您使用BeginInvoke

代码语言:javascript
复制
lvMyAssignments.Dispatcher.BeginInvoke( (Action)(() => 
        { 
            lvMyAssignments.ItemsSource = e.HandOverDocs; 
        })); 

通常,如果你有一个带有强类型委托签名的方法,比如:

代码语言:javascript
复制
public static void BeginInvoke( Action d ) { ... }

编译器可以将lambda表达式转换为所需的适当委托签名。但如果该方法是松散类型的:

代码语言:javascript
复制
public static void BeginInvoke( Delegate d ) { ... }

编译器不会接受lambda。但是,您可以将lambda表达式转换为特定的委托签名(比如Action),然后将其传递给该方法。编译器不能自动为您做这件事,因为有许多不同的委托类型可能是lambda签名的有效匹配...编译器没有办法知道哪一个是正确的。

票数 10
EN

Stack Overflow用户

发布于 2010-08-11 23:07:13

将其强制转换为委托对象,如Action

代码语言:javascript
复制
lvMyAssignments.Dispatcher.BeginInvoke((Action)(() => lvMyAssignments.ItemsSource = e.HandOverDocs)));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3459742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档