在以下代码中:
async Task<int> Foo()
{
int result;
await Task.Run( () => { result = 9999; } );
return result;
}
VS 2015报告错误:"使用未分配的局部变量'result'"。所以,让我们做一个改变:
async Task<int> Foo()
{
int result = 0;
await Task.Run( () => { result = 9999;} );
return result;
}
瞧。这不仅会编译,还会返回9999(正如预期的那样(。
为什么result
在第一个例子中被认为是未分配的,而它显然是在Task.Run
语句中分配的?
编译器不够聪明,无法知道是否要执行lambda() => result = 999
,因为它不知道Task.Run
的内部。
因为它不知道lambda是否会运行,所以它希望您保证result
在return
表达式之前有一个值分配给它。