2016-08-08 13 views
2

Ich habe eine Funktion, die eine Task<String> zurückgibt, um diese Task zu konstruieren Ich muss eine anonyme async Funktion verwenden, weil ich mehrere Anrufe innerhalb der await innerhalb der Task. Ich habe festgestellt, dass ich "" zurückkehren kann, aber wenn ich versuche, null einen Fehler zurückzugeben entstehen (Visual Studio Nachricht)Rückgabetypen innerhalb einer Aufgabe, die eine anonyme asynchrone Funktion ausführt?

Anonyme Funktion Delegaten für ungültig zu erklären umgewandelt Rückkehr kann einen Wert nicht zurück

Async Lambda-Ausdruck in einem umgewandeltes 'Task', der Delegat zurückgibt, kann keinen Wert zurückgeben. Wolltest du "Aufgabe" zurückgeben?

Eine Funktion das gleiche Problem zeigt

public virtual Task<String> FooBar() 
{ 
    return Task<String>.Run(async() => 
    { 
     await Task.Delay(1500); 
     return ""; // OK 
     //return null; // Error 
    }); 
} 

Was hier geschieht?

Wäre es passender zu return await Task.FromResult<String>(null);, wenn ich einen Nullwert zurückgeben möchte?

+1

Warum verwenden Sie 'Task.Run' an erster Stelle? Sie haben keine CPU-gebundene Arbeit, Sie haben asynchrone Arbeit; entferne diesen Anruf einfach ganz, da hier nichts erreicht wird. – Servy

+2

Es ist bemerkenswert, 'Task .Run' ist genau das gleiche wie' Task.Run', da es eine statische Methode für die Basisklasse ist. Der Compiler muss weiterhin den Rückgabetyp von dem Delegat ableiten, der für "Ausführen" bereitgestellt wird (was nicht möglich ist, wenn nur "null" verwendet wird). –

+0

@CharlesMager das macht Sinn und klärt ein anderes "Problem" auf. Visual Studio vergröbert den Bereich "" leicht und stellt fest, dass er nicht benötigt wird. Ich wusste, dass es irgendwie auf den Type hindeutete, aber jetzt sehe ich genau, wie es das macht. – KDecker

Antwort

2

Der Compiler weiß nicht, dass null Null ist und daher nicht automatisch den richtigen Typ Func<Task<string>> auswählen kann. Führen Sie stattdessen Folgendes aus, um dem Compiler mitzuteilen, dass die Null für eine Zeichenfolge gilt.

return (string)null; 

Auch, wie in den Kommentaren gebracht, ist Task.Run<TResult>(Func<Task<TResult>> function) eine statische Methode so, wenn Sie Task<String>.Run(... tun Sie immer noch die gleiche statische Methode Task.Run ohne zusätzliche Informationen aufrufen. Was Sie stattdessen tun müssen, ist es aufzurufen und den Typ an den Run Bereich zu übergeben, der den Rückgabetyp string erzwingt, anstatt den Compiler zu versuchen, herauszufinden, was der Rückgabetyp sein sollte.

public virtual Task<String> FooBar() 
{ 
    return Task.Run<String>(async() => 
    { 
     await Task.Delay(1500); 
     return null; // Does not error 
    }); 
} 
+0

Schlag mich einfach! Alternativ können Sie 'Task.Run ' verwenden. –

+0

FYI, Sie können 'Task.Run (...)' anstelle von 'Task .Run (...)' –

+1

Oder 'default (string)' –

Verwandte Themen