在 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
的真正实现或它会做什么。它不能假设它没有像我上面那样实现,因此一个未初始化的变量是可能的。
我有一个正在调用的方法,我想确保它在继续之前完全完成。我也很想知道它是否成功完成,所以我正在做以下事情:
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
的真正实现或它会做什么。它不能假设它没有像我上面那样实现,因此一个未初始化的变量是可能的。