我开始使用 .NET 4.5,尤其是 async/await 功能。
我来到下面的代码,令我惊讶的是,它编译了。谁能解释我的原因?
async Task SomeMethod()
{
try
{
await Task.Delay(1000);
}
catch
{
}
}
对于以前的 .NET 版本,编译器会抱怨类似以下的消息:“并非所有路径都返回值”。
我开始使用 .NET 4.5,尤其是 async/await 功能。
我来到下面的代码,令我惊讶的是,它编译了。谁能解释我的原因?
async Task SomeMethod()
{
try
{
await Task.Delay(1000);
}
catch
{
}
}
对于以前的 .NET 版本,编译器会抱怨类似以下的消息:“并非所有路径都返回值”。
返回的异步方法Task
等效于返回的普通方法void
。这里没有特定于 try/catch 的内容 - 不要忘记您的try
块也不会返回任何内容!
因此,您的代码的非异步版本将是:
void SomeMethod()
{
try
{
Thread.Sleep(1000)
}
catch
{
}
}
...显然这会编译。(同样显然,使用 bare 很糟糕catch
,但我认为这不是真正的问题:)
此代码不会编译:
async Task<int> SomeMethod()
{
try
{
await Task.Delay(1000);
return 10;
}
catch
{
}
}
为了回答您对 Jon 的回答的问题,我将这些链接添加为单独的答案以提高可读性。
为了获得有关幕后发生的事情的更多信息,我想向您指出 MSDN 杂志中的这些文章,这些文章帮助我开始使用它:
MSDN 2011 年 10 月号:使用 .NET 进行并行编程
特别是前两篇文章可能是您正在寻找的,因为它们更好地描述了编译器如何在内部重写您的代码以使其async/ await
工作。