无法将匿名方法转换为类型'System.Windows.Threading.DispatcherPriority',因为它不是委托类型

时间:2012-10-15 14:41:33

标签: c# wpf dispatcher

任何人都可以解释我需要做些什么来克服这个错误吗?

“无法将匿名方法转换为'System.Windows.Threading.DispatcherPriority',因为它不是委托类型”

    private void Test(object sender)
    {
        base.Dispatcher.BeginInvoke(delegate
        {
                       //some code

        }, new object[0]);
    }

由于

3 个答案:

答案 0 :(得分:2)

如果您使用的是.NET 3.5 SP1及更高版本,则可以添加对 System.Windows.Presentation.dll 的引用,并确保在{3}的顶部添加using System.Windows.Threading;文件。它包含更易于使用的扩展方法,并允许您简单地写:

base.Dispatcher.BeginInvoke(() => { /* some code */ });

如果您使用的是不带SP1或更低版本的.NET 3.5,那么您必须将委托转换为具体的委托类型:

base.Dispatcher.BeginInvoke((Action) delegate { /* some code */ }, new object[0]);

答案 1 :(得分:0)

修改
我对你将new object[0]作为“参数”传递给BeginInvoke感到困惑,并没有意识到这实际上意味着“没有参数”,因为代理之后的所有内容都在params集合中。 ..

我正在做一个需要一个整数的例子。

您想传递参数,因此最好使用此

private void Test(object sender)
{
    base.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action<int>)delegate(int i)
    {
                   //some code

    }, 5);
}

这将创建一个带有整数的匿名委托,将其转换为采用整数的操作,并使用参数5调用委托。

答案 2 :(得分:0)

更新了答案

将委托转发给Action(如果要返回值,则转到Func<something>。)

private void Test(object sender)
{
    base.Dispatcher.BeginInvoke((Action)delegate
    {
        //some code
    }, new object[0]);
}

Dispatcher.BeginInvoke方法的第一个参数需要System.Delegate。这种情况并不常见。通常,您需要指定FuncAction重载之一。但是,这里可以传递具有不同签名的代理。显然,匿名委托不会隐式地转换为System.Delegate


<强>更新

我正在使用.NET 3.5。在后来的Framework版本中,BeginInvoke的其他重载可能会干扰C#的重载机制。尝试

private void Test(object sender)
{
    base.Dispatcher.BeginInvoke((System.Delegate)(Action)delegate
    {
        //some code
    }, new object[0]);
}