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

Unclear about compiler error when using "out" in async-await block in C#

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

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);

但是我遇到了错误

CS0165 Use of unassigned local variable 'success'

这没什么大不了的,因为我可以变得可爱并初始化 success=false 并将其作为 ref 而不是 out 传递,这似乎可以按预期工作。但是,我很好奇 async-await(或 Task.Run)的错综复杂之处似乎导致无法保证 out success 将被正确分配的情况。

不胜感激!

编辑:

为了添加更多上下文,以下块可以正常编译和执行。

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

void Callee();

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

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

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

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

编译器不知道 Task.Run 的真正实现或它会做什么。它不能假设它没有像我上面那样实现,因此一个未初始化的变量是可能的。