Ich habe wirklich einfachen Code:
%Vor% Warum erhalte ich einen Compilerfehler für die erste Aufgabe?
Die Methodensignaturen (keine Parameter, Rückgabetyp ist int
) sind gleich, nicht wahr?
Ich kenne eine Lösung (das ist ganz einfach: var task = Task.Factory.StartNew<int>(GetInt);
), aber ich würde gerne wissen, was das Problem mit dem obigen Code ist.
Weil der Compiler nicht entscheiden kann, welche dieser beiden Überladungen verwendet werden soll:
%Vor% Der Grund dafür ist, dass der Rückgabetyp nicht Teil der Überladungsauflösung in C # ist (genauso wie Sie nicht zwei Überladungen haben können, die sich nur in Rückgabetypen unterscheiden) und der Compiler daher nicht entscheiden kann, ob GetInt
sein soll ein Action
oder ein Func<T>
. Das Erzwingen der Verwendung der generischen Version durch Aufrufen von StartNew<int>(GetInt)
liefert die erforderlichen Informationen.
Hilft beim Anzeigen der Ausnahme: "Der Aufruf ist zwischen den folgenden Methoden oder Eigenschaften nicht eindeutig: 'System.Threading.Tasks.TaskFactory.StartNew (System.Action)' und 'System.Threading.Tasks.TaskFactory' .StartNew (System.Func) '"
Wenn Sie einen Blick darauf werfen, gibt es zwei mögliche Methoden:
%Vor% Wenn Sie <int>
hinzufügen oder Func<int>
angeben, erzwingen Sie die erste Signatur. Ohne diesen Code ist der Code nicht eindeutig.
Sie erhalten den Kompilierungsfehler, weil die StartNew-Methode entweder eine Aktion (gibt void zurück) oder eine Func (gibt etwas zurück) Prädikate mit seinen verschiedenen Überladungen und nicht eine direkte Delegate.
Wie von anderen angegeben, müssen Sie GetInt als Funktion an StartNew übergeben oder angeben, dass Sie beabsichtigen, einen Wert von StartNew zurückzugeben, indem Sie den generischen Typ angeben. Andernfalls hat der Compiler keine Ahnung, welche Art von Aufgabe Sie erstellen möchten .... es ist mehrdeutig.
%Vor%Tags und Links c# compiler-errors task