无法隐式转换来自任务<>的types
我正在尝试在.NET 4.5中掌握asynchronous方法的语法。 我以为我已经正确地理解了这些例子,不pipeasynchronous方法的types是什么(即Task<T>
),我总是得到相同types的错误返回到T
– 我明白是非常自动的。 以下代码会产生错误:
不能将types
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; } }
如果我明确地施加了结果,它也会失败。 这个:
public List<int> TestGetMethod() { return (List<int>)GetIdList(); // compiler error on this line }
在某种程度上可预测的结果是这个错误:
无法将types
System.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();