Task <int>如何成为一个int?
我们有这个方法。
async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); // You can do work here that doesn't rely on the string from GetStringAsync. DoIndependentWork(); string urlContents = await getStringTask; //The thing is that this returns an int to a method that has a return type of Task<int> return urlContents.Length; } 在Task <>和int之间是否发生隐式转换? 如果没有,那么发生了什么事,它是如何实施的?
在Task <>和int之间是否发生隐式转换?
 不。 这只是async / await工作的一部分。 
 声明为async任何方法必须具有以下返回types: 
-   void(如果可能,避免)
-   Task(没有超出完成/失败通知的结果)
-   Task<T>(对于asynchronous方式的Ttypes的逻辑结果)
 编译器做所有适当的包装。 重点是你asynchronous返回的urlContents.Length – 你不能让方法返回int ,因为实际的方法将返回当它尚未完成的第一个awaitexpression式。 所以相反,它返回一个Task<int> ,当asynchronous方法完成时它将完成。 
 请注意, await做相反的事情 – 它将Task<T> 解开为T值,这就是这条线的工作原理: 
 string urlContents = await getStringTask; 
  …但是当然它会asynchronous解包,而使用Result会阻塞,直到任务完成。  ( await可以解开其他types的实现等待模式,但Task<T>是你可能经常使用的)。 
这种双重包装/解包是允许asynchronous如此组合的。 例如,我可以编写另一个调用你的asynchronous方法,并将结果加倍:
 public async Task<int> AccessTheWebAndDouble() { var task = AccessTheWeb(); int result = await task; return result * 2; } 
  (或者干脆return await AccessTheWeb() * 2;当然。) 
不需要将任务转换为int。 简单地使用任务结果。
 int taskResult= AccessTheWebAndDouble.Result; public async Task<int> AccessTheWebAndDouble() { int task = AccessTheWeb(); return task; } 
它会返回值,如果可用,否则返回0。