Task.Factory.StartNew () Überladungen

8

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.

    
GameScripting 05.04.2012, 18:54
quelle

6 Antworten

3

Sie erhalten einen mehrdeutigen Aufruffehler, da die Methodensignatur identisch ist. Rückgabewerte sind nicht Teil der Signatur.

Da Sie keinen expliziten Rückgabetyp angeben, weiß der Compiler nicht, was zu tun ist.

Methodensignatur in C #

    
Alex 05.04.2012, 19:01
quelle
3

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.

    
ChrisWue 05.04.2012 19:13
quelle
1

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.

    
Ian Mercer 05.04.2012 19:06
quelle
1

Für die Aufzeichnung, hier sind zwei weitere Möglichkeiten, es zu tun (das kompilieren):

%Vor%     
Douglas 05.04.2012 19:11
quelle
0

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.

    
Scorpion-Prince 05.04.2012 18:58
quelle
0

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%     
Eric Dahlvang 05.04.2012 19:08
quelle

Tags und Links