web-dev-qa-db-fra.com

Impossible de convertir implicitement le type de la tâche <>

J'essaie de maîtriser la syntaxe de la méthode asynchrone dans .NET 4.5. Je pensais avoir compris exactement les exemples, quel que soit le type de la méthode asynchrone (ie Task<T>), J’obtiens toujours le même type d’erreur d’erreur lors de la conversion en T - ce que j’ai compris était à peu près automatique. Le code suivant génère l'erreur:

Impossible de convertir implicitement le type 'System.Threading.Tasks.Task<System.Collections.Generic.List<int>>' à 'System.Collections.Generic.List<int> '

public List<int> TestGetMethod()
{
    return GetIdList(); // compiler error on this line
}


async Task<List<int>> GetIdList()
{
    using (HttpClient proxy = new HttpClient())
    {
        string response = await proxy.GetStringAsync("www.test.com");
        List<int> idList = JsonConvert.DeserializeObject<List<int>>();
        return idList;
    }
}

Cela échoue si jette explicitement le résultat également. Cette:

public List<int> TestGetMethod()
{
    return (List<int>)GetIdList();  // compiler error on this line
}

de façon assez prévisible entraîne cette erreur:

Impossible de convertir le type 'System.Threading.Tasks.Task<System.Collections.Generic.List<int>>' à 'System.Collections.Generic.List<int> '

Toute aide grandement appréciée.

59
PaulR

Le problème principal avec votre exemple, vous ne pouvez pas implicitement convertir Task<T> renvoie les types au type de base T. Vous devez utiliser la propriété Task.Result. Notez que Task.Result bloque le code async et doit être utilisé avec précaution.

Essayez ceci à la place:

public List<int> TestGetMethod()  
{  
    return GetIdList().Result;  
}
83
user2388853

Vous devez également utiliser TestGetMethod async et l'attacher devant GetIdList(); pour dérouler la tâche en List<int>, Donc, si votre fonction d'assistance renvoie la tâche, assurez-vous de l'attendre pendant que vous appelez la fonction async.

public Task<List<int>> TestGetMethod()
{
    return GetIdList();
}    

async Task<List<int>> GetIdList()
{
    using (HttpClient proxy = new HttpClient())
    {
        string response = await proxy.GetStringAsync("www.test.com");
        List<int> idList = JsonConvert.DeserializeObject<List<int>>();
        return idList;
    }
}

ne autre option

public async void TestGetMethod(List<int> results)
{
    results = await GetIdList(); // await will unwrap the List<int>
}
29
Mayank

En fonction de ce que vous essayez de faire, vous pouvez bloquer avec GetIdList (). Résultat (généralement une mauvaise idée, mais il est difficile de dire le contexte) ou utiliser un framework de test prenant en charge les méthodes de test async. var résultats = wait GetIdList ();

3
James Manning