2

谁能解释我需要做什么才能克服这个错误?

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

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

        }, new object[0]);
    }

谢谢

4

3 回答 3

2

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

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

如果您使用没有 SP1 或更低版本的 .NET 3.5,则必须将委托转换为具体委托类型:

base.Dispatcher.BeginInvoke((Action) delegate { /* some code */ }, new object[0]);
于 2012-10-15T14:51:41.497 回答
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

于 2012-10-15T14:42:30.657 回答
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。在更高的框架版本中,额外的重载BeginInvoke可能会干扰 C# 的重载机制。尝试

private void Test(object sender)
{
    base.Dispatcher.BeginInvoke((System.Delegate)(Action)delegate
    {
        //some code
    }, new object[0]);
}
于 2012-10-15T14:55:27.893 回答