使用异步进行奇怪的try..catch行为

dze*_*ras 3 c# asynchronous exception-handling

我开始使用.NET 4.5,特别是async/await功能.

我来到下面的代码,这令我惊讶,编译.谁能解释我的原因?

async Task SomeMethod()
{
    try
    {
        await Task.Delay(1000);
    }
    catch
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

对于以前的.NET版本,编译器会抱怨类似于以下消息:"并非所有路径都返回值".

Jon*_*eet 5

返回的异步方法Task等同于返回的普通方法void.这里没有任何尝试/捕捉特定的东西 - 不要忘记你的try块也没有返回任何东西!

因此,代码的非异步版本只是:

void SomeMethod()
{
    try
    {
        Thread.Sleep(1000)
    }
    catch
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

......显然那会编译.(同样显然,使用裸露是可怕的catch,但我认为这不是真正的问题:)

代码将无法编译:

async Task<int> SomeMethod()
{
    try
    {
        await Task.Delay(1000);
        return 10;
    }
    catch
    {

    }
}
Run Code Online (Sandbox Code Playgroud)