以下方法或属性C#之间的调用不明确
本文关键字:之间 调用 不明确 属性 方法 | 更新日期: 2023-09-27 17:59:53
在编译我的程序时(我从MonoDevelop IDE编译它),我收到一个错误:
错误CS0121:以下方法或之间的调用不明确属性:
System.Threading.Thread.Thread(System.Threading.ThreadStart)' and
System.Threading.Thread(System.Threading.ParameterizedThreadStart)'(CS0121)
这是代码的一部分。
Thread thread = new Thread(delegate {
try
{
Helper.CopyFolder(from, to);
Helper.RunProgram("chown", "-R www-data:www-data " + to);
}
catch (Exception exception)
{
Helper.DeactivateThread(Thread.CurrentThread.Name);
}
Helper.DeactivateThread(Thread.CurrentThread.Name);
});
thread.IsBackground = true;
thread.Priority = ThreadPriority.Lowest;
thread.Name = name;
thread.Start();
delegate { ... }
是一个匿名方法,可以分配给任何委托类型,包括ThreadStart
和ParameterizedThreadStart
。由于线程类提供了具有两种参数类型的构造函数重载,因此不清楚哪种构造函数重载是指什么。
delegate() { ... }
(注意括号)是一个不带参数的匿名方法。只能将它分配给不带参数的委托类型,如Action
或ThreadStart
。
所以,把你的代码改为
Thread thread = new Thread(delegate() {
如果要使用ThreadStart
构造函数重载,或者使用
Thread thread = new Thread(delegate(object state) {
如果要使用ParameterizedThreadStart
构造函数重载。
当您的方法有重载,并且您的使用可以使用任一重载时,就会抛出此错误。编译器不确定要调用哪个重载,因此需要通过强制转换参数来显式声明它。一种方法是这样的:
Thread thread = new Thread((ThreadStart)delegate {
try
{
Helper.CopyFolder(from, to);
Helper.RunProgram("chown", "-R www-data:www-data " + to);
}
catch (Exception exception)
{
Helper.DeactivateThread(Thread.CurrentThread.Name);
}
Helper.DeactivateThread(Thread.CurrentThread.Name);
});
或者,您可以使用lambda:
Thread thread = new Thread(() =>
{
try
{
Helper.CopyFolder(from, to);
Helper.RunProgram("chown", "-R www-data:www-data " + to);
}
catch (Exception exception)
{
Helper.DeactivateThread(Thread.CurrentThread.Name);
}
Helper.DeactivateThread(Thread.CurrentThread.Name);
});
thread.IsBackground = true;
thread.Priority = ThreadPriority.Lowest;
thread.Name = name;
thread.Start();