为什么 Task.Run 参数中使用的外部变量被视为未分配?

Gla*_*arp 1 c# variable-assignment

在以下代码中:

async Task<int> Foo()
{
    int result;
    await Task.Run( () => { result = 9999; } );
    return result;
}
Run Code Online (Sandbox Code Playgroud)

VS 2015 报错:“Use of unassigned local variable 'result'”。所以,让我们做一个改变:

async Task<int> Foo()
{
    int result = 0;
    await Task.Run( () => { result = 9999;} );
    return result;
}
Run Code Online (Sandbox Code Playgroud)

瞧。这不仅会编译,还会返回 9999(如预期)。

为什么result在第一个例子中当它在Task.Run语句中明显被赋值时被认为是未赋值的?

Dan*_*ogh 5

编译器不够聪明,无法知道 lambda() => result = 999是否会被执行,因为它不知道Task.Run.

因为它不知道 lambda 是否会运行,所以它希望您保证resultreturn表达式之前为其分配了一个值。