2013-02-16 13 views
6

Podczas kompilowania mój program (i skompilować go z MonoDevelop IDE) i komunikat o błędzie:Wywołanie jest niejednoznaczna między następujące metody lub właściwości С #

Error CS0121: The call is ambiguous between the following methods or properties: System.Threading.Thread.Thread(System.Threading.ThreadStart)' and System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)' (CS0121)

Oto część kodu.

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(); 

Dzięki za uwagę

Odpowiedz

8

delegate { ... } jest anonimowy sposób, który może być przypisany do wszelkiego rodzaju delegata, w tym ThreadStart i ParameterizedThreadStart. Ponieważ klasa wątków zapewnia przeciążenie konstruktora dwoma typami argumentów, nie jest jednoznaczne, co oznacza przeciążenie konstruktora.

delegate() { ... } (nota nawias) jest anonimowy sposób, że nie wymaga żadnych argumentów. To może być przypisany tylkodelegować typów, które mają żadnych argumentów, takich jak Action lub ThreadStart.

więc zmienić swój kod do

Thread thread = new Thread(delegate() { 

jeśli chcesz używać przeciążenie konstruktora ThreadStart lub

Thread thread = new Thread(delegate(object state) { 

jeśli chcesz używać przeciążenie ParameterizedThreadStart konstruktora.

2

Ten błąd jest generowany, gdy masz metodę, która ma przeciążeń i Twojego użytkowania może pracować zarówno z przeciążeniem. Kompilator nie jest pewien, którego przeciążenia chcesz wywołać, więc musisz go jawnie podać, przesyłając parametr. Jednym ze sposobów na to jest tak:

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); 
}); 
0

Alternatywnie, można użyć 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();   
Powiązane problemy