web-dev-qa-db-ja.com

Task <>からタイプを暗黙的に変換できません

.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>」に変換できません

どんな助けも大歓迎です。

59
PaulR

サンプルの主な問題は、Task<T>戻り型をベースT型に暗黙的に変換できないことです。 Task.Resultプロパティを使用する必要があります。 Task.Resultは非同期コードをブロックするため、注意して使用する必要があることに注意してください。

代わりにこれを試してください:

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

TestGetMethod asyncも作成する必要があり、GetIdList();の前にawaitを付加するとタスクがList<int>に展開されます。したがって、ヘルパー関数がTaskを返している場合は、関数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>
}
29
Mayank

実行しようとしていることに応じて、GetIdList()。Resultでブロックするか(一般的には悪い考えですが、コンテキストを伝えるのは難しいです)、または非同期テストメソッドをサポートするテストフレームワークを使用してテストメソッドを実行することができますvar results = await GetIdList();

3
James Manning