You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C# async-await块中使用out关键字时遭遇编译器错误的疑问

解决编译器错误CS0165:未赋值的局部变量'success'

这个问题我之前也碰到过,编译器的静态代码分析在这里有点“死板”——虽然咱们知道Task.Run里的Bar(out success)肯定会给success赋值,但编译器没办法通过静态分析确认这一点,所以它会认为success可能未被初始化就进入了后续的判断逻辑,抛出CS0165错误。

下面给你几个简单有效的解决办法:

方法1:提前初始化success变量

直接给success一个初始值(哪怕这个值会被Bar覆盖),就能让编译器放下顾虑:

async void Foo() {
    bool success = false; // 提前初始化,让编译器安心
    // 其他操作
    await Task.Run( () => Bar(out success) );
    if (!success) {
        // 错误处理逻辑
    }
    // 其他操作
}
void Bar(out bool success);

因为out参数要求Bar方法必须给success赋值,所以初始值只是用来满足编译器的静态检查,实际运行时会被Bar的结果覆盖,不会影响逻辑。

方法2:把Bar改成返回bool类型(更推荐)

out参数在异步代码里容易引发这类编译问题,更优雅的方式是让Bar直接返回执行结果,这样代码逻辑更清晰,也能彻底避免未赋值的问题:

async void Foo() {
    bool success;
    // 其他操作
    success = await Task.Run(() => Bar());
    if (!success) {
        // 错误处理逻辑
    }
    // 其他操作
}
bool Bar();

这种写法更符合C#异步编程的习惯,编译器也能明确跟踪到success的赋值过程,不会再报错。

另外提一句:尽量避免使用async void方法(除非是事件处理器),因为async void的异常无法被常规的try/catch捕获,建议改成async Task返回类型,这样代码的可靠性更高。

内容的提问来源于stack exchange,提问作者J. Arrillaga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:31:57