在C#中的async-await块中使用"out"时,不清楚编译器错误

J. *_*aga 0 c# out task async-await

我有一个我正在调用的方法,我想确保它在继续之前完成.我也有兴趣知道它是否成功完成,所以我正在做以下事情:

async void Foo() {
  bool success;

  // stuff

  await Task.Run(
    () => Bar(out success)
  );

  if (!success) { // this is the line causing the compiler-error
    // handle
  }

  // other stuff
}

void Bar(out bool success);
Run Code Online (Sandbox Code Playgroud)

但是我收到了错误

CS0165使用未分配的局部变量'success'

这不是一个大问题,因为我可以变得可爱并初始化success=false并传递它,ref而不是out看起来像希望的那样.但是,我很好奇async-await(或Task.Run)的复杂性似乎会导致一个不保证的情况out success会被正确分配.

任何启示都表示赞赏!

编辑:

要添加更多上下文,以下块编译并执行正常.

void Caller() {
  bool success;
  Callee(out success);
  if (success) {
    // do something
  }
}

void Callee();
Run Code Online (Sandbox Code Playgroud)

这是因为out参数在传递之前不需要初始化.有关更多信息,请访问out:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier

Dav*_*e M 6

考虑以下可能(尽管完全不正确)的实现Task.Run:

public class Task
{
    public static Task Run(Action action)
    {
        return Task.Delay(500);
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

现在想想有问题的代码.有了这个实现Task.Run,这个Bar方法会被调用吗?success不会.因此永远不会被初始化,并且尝试访问未初始化的变量.

编译器不知道Task.Run它的实际实现或它将做什么.它不能假设它没有像我上面那样实现,因此可以使用未初始化的变量.