我正在开发一个Windows Forms应用程序,其中包含自定义控件,这些控件的方法可能会从UI线程以外的线程调用。因此,为了防止异常,这些方法看起来像这样:
public void DoSomeStuff()
{
if (InvokeRequired)
{
Invoke((Action)DoSomeStuff);
}
else
{
// Actually do some stuff.
}
}
将方法组DoSomeStuff
显式转换为Action
引起了我的注意,因此我比以前深入研究了委托和其他相关主题。
虽然我在这里看到了一些相关的问题,但我没有找到确切的答案,即:
为什么在这种情况下方法组DoSomeStuff
需要显式转换为Action
?
如果我去掉转换,那么就会出现两个错误:
错误102 参数1:无法将'method group'转换为 'System.Delegate'
错误101 'System.Windows.Forms.Control.Invoke(System.Delegate, object[])'的最佳重载方法有一些无效的参数
编译器似乎不能确定使用哪种Invoke
重载的事实,这似乎是一个相当大的提示,但我仍然不确定它为什么无法弄清楚。我希望编译器能够推断应该使用第一个Invoke
重载,它接受单个Delegate
参数。
我之所以这样希望,是因为如果代码像这样编写,就不会出现问题:
Action a = DoSomeStuff;
Invoke(a);
方法组DoSomeStuff
可以隐式转换为Action
委托类型,而Action
从System.Delegate
派生(在技术上?),因此Invoke
可以毫不费力地处理参数a
。但是,当我尝试直接将DoSomeStuff
作为参数传递时,为什么编译器不能进行隐式转换呢?老实说,我对自己的逻辑并不完全信服,但我仍然不确定自己错了哪里。
void Foo(out string abc);
无法使用Action
或Func
表示。如果他们将Action/Func推断实现为一种语言特性,那么该特性将被破坏。 - GeirGrusom