C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトでTask型の戻り値を設定した関数を利用した際に[CS0029: 型 ‘System.Threading.Tasks.Task<System.Collections.Generic.List<string>>’ を ‘System.Collections.Generic.List<string>’ に暗黙的に変換できません]エラーになる場合の対処法です。
[CS0029]エラー
非同期で実行される関数で用いられる[Task]型の戻り値。戻り値を持たない[void]型の戻り値を使う場合は、あまり気にすることはありません。
しかし、戻り値を利用する場合にはエラーになるケースがあります。
コレクション型の戻り値の場合
戻り値を持たない[void]で設定した関数の場合
private async void Func()
{
//非同期処理
}
呼び出す方は、何も気にせず使えます。
private async void Hoge()
{
Func();
}
戻り値を持つ場合は、戻り値を[Task<>]で括ります。
private async Task<int> Func()
{
int Result = 0;
//非同期処理
return Result;
}
呼び出す方は[await]を利用して非同期処理を呼び出します。
private async void Hoge()
{
int ResultFunc = await Func();
}
このケースは[await]を使わずに実行した場合、エラーの内容に[await]を使えと表示されるので、気が付きます。
さらに[List<string>]のようなコレクション型も戻り値として使えます。
private async Task<List<string>> Func()
{
List<string> Result = new List<string>();
//非同期処理
return Result;
}
これも他の戻り値と同じで[await]を使えば問題ありません。
private async void Hoge()
{
int ResultFunc = await Func();
}
コレクション型の戻り値の場合は、エラーの内容に[await]に関する表示が無いので、型やキャストを調べてしまい、原因を特定するのに時間がかかってしまった…
非同期の関数を利用する場合、関数に[async]や[await]を追加すれば簡単に実装ができますが、戻り値を利用する場合には実装方法に注意が必要な場合が出てきます。
まとめ
今回は、WinUI3プロジェクトでTask型の戻り値を設定した関数を利用した際に[CS0029: 型 ‘System.Threading.Tasks.Task<System.Collections.Generic.List<string>>’ を ‘System.Collections.Generic.List<string>’ に暗黙的に変換できません]エラーになる場合の対処法について紹介しました。
非同期の関数を利用する場合、関数に[async]や[await]を追加して実装を行いますが、呼び出す方にも注意が必要な場合が出てきます。
WinUI 3で[CS0029: 型 ‘System.Threading.Tasks.Task<System.Collections.Generic.List<string>>’ を ‘System.Collections.Generic.List<string>’ に暗黙的に変換できません]が表示されて困っている人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。