Ich habe eine Methode:Wie bekomme ich dieses asynchrone Lambda zum kompilieren, ohne unerreichbaren Code hinzuzufügen?
void MyMethod<T>(params Func<T>[] funcs) { }
Ich möchte es mit Asynchron-Lambda-Ausdrücke nennen:
MyMethod(async() => 1, async() => 2, async() => 3);
Es funktioniert! Aber was, wenn ich möchte, dass das dritte Lambda eine Ausnahme auslöst?
MyMethod(async() => 1, async() => 2, async() => { throw new Exception(); });
Die oben nicht kompilieren, gibt es zwei identische Fehler:
CS0201 Nur Zuordnung, anruf, Erhöhung, Senkung und neue Objekt Ausdrücke können als Anweisungen verwendet werden
Ich bin mir nicht sicher, warum es diesen Fehler gibt, aber ich verstehe, warum es nicht kompilieren kann - die ersten beiden Lambdas sind Func<Task<int>>
, während der letzte Func<Task>
ist. Ich würde erwarten, dass es mir einen besseren Kompilierungsfehler gibt, aber lassen Sie uns dieses Problem beiseite legen.
Wie bekomme ich den Code zum kompilieren? Wahrscheinlich müsste ich dem Compiler sagen, welche Art von Aufgabe ich für das dritte asynchrone Lambda erzeugen möchte. Ein Weg, fand ich ist eine return
Anweisung nach der throw
Anweisung angeben:
MyMethod(async() => 1, async() => 2, async() => { throw new Exception(); return 3; });
Abgesehen davon, dass hässlich und verwirrend, es erzeugt eine Compiler-Warnung:
CS0162 Unreachable Code erkannt
Wie mache ich den Compiler glücklich? Wie vermeide ich unerreichbaren Code, nur um ihn kompilieren zu lassen? Gibt es eine andere Möglichkeit, den Task-Typ anzugeben, der von einem asynchronen Lambda zurückgegeben werden soll?
Auch, warum bekomme ich einen CS0201 Fehler in dem obigen Beispiel?
Warum verwenden Sie async lambdas an erster Stelle, vorausgesetzt, Sie verwenden nicht 'erwarten'? – Servy
@Servy: Aktueller Code wird verwendet erwartet. Es gibt sogar ein Warten auf das dritte Lambda, das eine Ausnahme auslöst. Dies ist eine abgespeckte Version des Codes. –
Geben Sie dann ein Beispiel an, das tatsächlich Ihren tatsächlichen Code darstellt. – Servy