无法从Task<>隐式转换类型

时间:2012-10-14 21:10:17

标签: c# async-await

我正在尝试在.NET 4.5中掌握异步方法语法。我以为我已经完全理解了这些例子,但无论异步方法的类型是什么(即Task<T>),我总是在转换回T时得到相同类型的错误错误 - 我理解是非常自动的。以下代码生成错误:

  

无法将类型“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
}

在某种程度上可以预见会导致此错误:

  

无法将类型“System.Threading.Tasks.Task<System.Collections.Generic.List<int>>”转换为“System.Collections.Generic.List<int>

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:80)

您的示例的主要问题是您无法将Task<T>返回类型隐式转换为基本T类型。您需要使用Task.Result属性。请注意,Task.Result将阻止异步代码,应谨慎使用。

请改为尝试:

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

答案 1 :(得分:28)

你也需要创建TestGetMethod async并在GetIdList();前面附加await会将任务解包到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;
    }
}

另一个选项

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

答案 2 :(得分:3)

根据您尝试做的事情,您可以使用GetIdList()进行阻止。结果(通常是一个坏主意,但很难说出上下文)或使用支持异步测试方法的测试框架并拥有测试方法do var results = await GetIdList();