私は.NET4.5、特に非同期/待機機能をいじり始めています。
驚いたことに、コンパイルする以下のコードにたどり着きました。誰かが私の理由を説明できますか?
async Task SomeMethod()
{
try
{
await Task.Delay(1000);
}
catch
{
}
}
以前の.NETバージョンでは、コンパイラは「すべてのパスが値を返すわけではありません」のようなメッセージで文句を言います。
私は.NET4.5、特に非同期/待機機能をいじり始めています。
驚いたことに、コンパイルする以下のコードにたどり着きました。誰かが私の理由を説明できますか?
async Task SomeMethod()
{
try
{
await Task.Delay(1000);
}
catch
{
}
}
以前の.NETバージョンでは、コンパイラは「すべてのパスが値を返すわけではありません」のようなメッセージで文句を言います。
戻る非同期メソッドTask
は、を返す通常のメソッドと同等void
です。ここにはtry/catch固有のものは何もありません-try
ブロックも何も返さないことを忘れないでください!
したがって、コードの非同期バージョンは次のようになります。
void SomeMethod()
{
try
{
Thread.Sleep(1000)
}
catch
{
}
}
...そして明らかにそれはコンパイルされるでしょう。(同様に明らかに、裸で使用するのは恐ろしいですが、それcatch
は実際には問題ではないと思います:)
このコードはコンパイルされません:
async Task<int> SomeMethod()
{
try
{
await Task.Delay(1000);
return 10;
}
catch
{
}
}
Jonの回答に対するあなたの質問に応えて、読みやすくするためにこれらのリンクを別の回答として追加します。
舞台裏で何が起こっているかについての詳細を知るために、MSDNマガジンからこれらの記事を紹介したいと思います。
MSDN 2011年10月号:.NETを使用した並列プログラミング
特に最初の2つの記事は、コンパイラーがコードを内部的に書き直して機能させる方法をよりよく説明しているため、探しているものかもしれませんasync/ await
。