.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>
」に変換できません
どんな助けも大歓迎です。
サンプルの主な問題は、Task<T>
戻り型をベースT
型に暗黙的に変換できないことです。 Task.Resultプロパティを使用する必要があります。 Task.Resultは非同期コードをブロックするため、注意して使用する必要があることに注意してください。
代わりにこれを試してください:
public List<int> TestGetMethod()
{
return GetIdList().Result;
}
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>
}
実行しようとしていることに応じて、GetIdList()。Resultでブロックするか(一般的には悪い考えですが、コンテキストを伝えるのは難しいです)、または非同期テストメソッドをサポートするテストフレームワークを使用してテストメソッドを実行することができますvar results = await GetIdList();