无法隐式转换来自任务<>的types

我正在尝试在.NET 4.5中掌握asynchronous方法的语法。 我以为我已经正确地理解了这些例子,不pipeasynchronous方法的types是什么(即Task<T> ),我总是得到相同types的错误返回到T – 我明白是非常自动的。 以下代码会产生错误:

不能将typesSystem.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; } } 

如果我明确地施加了结果,它也会失败。 这个:

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

在某种程度上可预测的结果是这个错误:

无法将typesSystem.Threading.Tasks.Task<System.Collections.Generic.List<int>>转换为' System.Collections.Generic.List<int> '

任何帮助不胜感激。

你的例子中的主要问题是你不能隐式地将Task<T>返回types转换为基类T型。 您需要使用Task.Result属性。 请注意,Task.Result将阻止asynchronous代码,并应谨慎使用。

试试这个:

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

您还需要使TestGetMethod async并附加等待在GetIdList(); 将解包任务到List<int> ,所以如果你的帮助函数正在返回任务确保你有等待,因为你也调用函数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; } } 

另外一个select

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

根据你想要做什么,你可以用GetIdList()来阻塞。结果(通常是一个坏主意,但很难告诉上下文),或者使用支持asynchronoustesting方法的testing框架,并且使testing方法var results = await GetIdList();