繁体   English   中英

在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使用未分配的局部变量“成功”

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

任何启发,感激不尽!

编辑:

要添加更多上下文,以下块可以编译并执行。

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

void Callee();

这是因为out参数在传递之前不需要初始化。 有关更多信息,请outhttps : //docs.microsoft.com/zh-cn/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的实际实现或其作用。 不能假设它没有像我上面那样实现,因此可能有未初始化的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM