Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot implicitly convert type from Task<>

Tags:

c#

async-await

I am trying to master async method syntax in .NET 4.5. I thought I had understood the examples exactly however no matter what the type of the async method is (ie Task<T>), I always get the same type of error error on the conversion back to T - which I understood was pretty much automatic. The following code produces the error:

Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Collections.Generic.List<int>>' to '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;     } } 

It fails if I explicitly cast the result as well. This:

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

somewhat predictably results in this error:

Cannot convert type 'System.Threading.Tasks.Task<System.Collections.Generic.List<int>>' to 'System.Collections.Generic.List<int>'

Any help greatly appreciated.

like image 859
PaulR Avatar asked Oct 14 '12 21:10

PaulR


2 Answers

The main issue with your example that you can't implicitly convert Task<T> return types to the base T type. You need to use the Task.Result property. Note that Task.Result will block async code, and should be used carefully.

Try this instead:

public List<int> TestGetMethod()   {       return GetIdList().Result;   } 
like image 153
user2388853 Avatar answered Sep 22 '22 06:09

user2388853


You need to make TestGetMethod async too and attach await in front of GetIdList(); will unwrap the task to List<int>, So if your helper function is returning Task make sure you have await as you are calling the function async too.

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;     } } 

Another option

public async void TestGetMethod(List<int> results) {     results = await GetIdList(); // await will unwrap the List<int> } 
like image 36
Mayank Avatar answered Sep 23 '22 06:09

Mayank