2013-02-16 2 views
6

Während mein Programm kompiliert (i kompilieren von MonoDevelop IDE) i erhalten eine Fehlermeldung:Der Aufruf ist nicht eindeutig zwischen den folgenden Methoden oder Eigenschaften С #

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)

Hier ist der Teil des Codes.

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

Vielen Dank für Ihre Aufmerksamkeit

Antwort

8

delegate { ... } ist eine anonyme Methode, die jede Delegattyp zugeordnet werden können, einschließlich ThreadStart und ParameterizedThreadStart. Da die Thread-Klasse Konstruktorüberladungen mit beiden Argumenttypen zur Verfügung stellt, ist es mehrdeutig, welche Konstruktorüberladung gemeint ist.

delegate() { ... } (beachten Sie die Klammer) ist eine anonyme Methode, die keine Argumente annimmt. Es kann nur zugeordnet werden, um Typen zu delegieren, die keine Argumente annehmen, wie Action oder ThreadStart.

So ändern Sie den Code zu

Thread thread = new Thread(delegate() { 

, wenn Sie den ThreadStart Konstruktor Überlastung oder zu

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

, wenn Sie den ParameterizedThreadStart Konstruktor Überlastung verwenden möchten verwenden möchten.

2

Dieser Fehler wird ausgelöst, wenn Sie eine Methode, die Überlastungen und Ihre Nutzung hat könnte entweder mit Überlastung arbeiten. Der Compiler ist nicht sicher, welche Überladung Sie aufrufen möchten, daher müssen Sie sie explizit angeben, indem Sie den Parameter übergeben. Eine Möglichkeit, dies zu tun ist, wie folgt aus:

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

Alternativ können Sie auch eine Lambda verwenden:

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