任何人都可以解释我需要做些什么来克服这个错误吗?
“无法将匿名方法转换为'System.Windows.Threading.DispatcherPriority',因为它不是委托类型”
private void Test(object sender)
{
base.Dispatcher.BeginInvoke(delegate
{
//some code
}, new object[0]);
}
由于
答案 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
。这种情况并不常见。通常,您需要指定Func
或Action
重载之一。但是,这里可以传递具有不同签名的代理。显然,匿名委托不会隐式地转换为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]);
}