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