Si verifica una conversione implicita tra Task <> e int?
No. Questa è solo una parte di come async/ awaitfunziona.
Qualsiasi metodo dichiarato come asyncdeve avere un tipo restituito di:
void (evitare se possibile)
Task (nessun risultato oltre la notifica di completamento / fallimento)
Task<T>(per un risultato logico di tipo Tin modo asincrono)
Il compilatore esegue tutti i wrapping appropriati. Il punto è che stai restituendo in modo asincronourlContents.Length : non puoi fare in modo che il metodo ritorni semplicemente int, poiché il metodo effettivo tornerà quando raggiunge la prima awaitespressione che non è già stata completata. Quindi, invece, restituisce un Task<int>che verrà completato quando il metodo asincrono stesso sarà completato.
Si noti che awaitfa il contrario - si scarta un Task<T>ad un Tvalore, che è come funziona questa linea:
string urlContents = await getStringTask;
... ma ovviamente lo scarta in modo asincrono, mentre il semplice utilizzo Resultsi bloccherebbe fino al completamento dell'attività . ( awaitpuò scartare altri tipi che implementano il modello di attesa, ma Task<T>è quello che probabilmente utilizzerai più spesso.)
Questo doppio avvolgimento / scartamento è ciò che consente a Async di essere così componibile. Ad esempio, potrei scrivere un altro metodo asincrono che chiama il tuo e raddoppia il risultato:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(O semplicemente return await AccessTheWebAsync() * 2;ovviamente.)
asyncparola chiave.