このC#コンパイラエラーに遭遇しました。コンパイラがラムダのタイプを推測できないことは問題ありませんが、エラーメッセージは間違っているようです。関連するコードは次のとおりです。
Func<object> lambda = async () => { return await Task.FromResult(1); };
コンパイラエラーは次のとおりです。
エラーCS4010:非同期ラムダ式をデリゲート型'
System.Func<object>
'に変換できません。非同期ラムダ式はvoid
、Task
またはを返す場合Task<T>
がありますが、いずれも'System.Func<object>
'に変換できません。
よくわからない部分が最後の文です。ラムダは確かに戻ってきTask<int>
ますが、なぜコンパイラはそれを変換しようとすべきだと考えるのSystem.Func<object>
ですか?
一方、エラーメッセージが伝えようとしているのSystem.Func<Task<int>>
がに割り当てることができないSystem.Func<object>
場合は、ジェネリックデリゲートの共分散のおかげでそうではないようです。つまり、これは代わりに問題なく機能します。
Func<object> lambda = new Func<Task<int>>(async () => { return await Task.FromResult(1); });