变量超出作用域错误,(我假设)正确的作用域声明- c#



用例是一个带有复选框的GUI,如果复选框被标记,我只想在其中运行遵从性检查(外部python脚本)。如果符合性检查运行,我想保存处理的输出字符串。

这是一个我的代码的快照:

Task<string> comp_python;
if (compliance) // compliance is t/f based on whether the checkbox is marked
{
string cmd = "some python command";
comp_python = runCompAsync(cmd);
}
// some processing
if (compliance)
{
string comp_res = await comp_python; // out of scope error here on comp_python
}

在第二个条件中,我在comp_python任务对象上得到一个超出范围的错误。我已经尝试删除这两个块之间的所有处理,我的范围仍然是错误的。什么好主意吗?

如果这可以通过重写代码的另一种方式完成,我也可以接受另一种解决方案。

可达性规则和确定赋值规则不知道compliance在两个if语句中是相同的值。因此,编译器认为有可能第一个iffalse,第二个iftruecomp_python将永远不会被分配到该路径上;它是声明的,但它从来没有根据确定赋值规则明确地赋值。(局部变量是而不是)如果未赋值,则为Null/default,如果访问可能未赋值的local,则会导致编译器错误。

解决这个问题的一种方法是将中间代码拆分为另一个方法(或者是一个局部方法,如果这是唯一使用它的方法),允许您在一个块中声明,赋值和使用局部方法。
if (compliance) // compliance is t/f based on whether the checkbox is marked
{
string cmd = "some python command";
Task<string> comp_python = runCompAsync(cmd);
someProcessing();
string comp_res = await comp_python;
}
else
{
someProcessing();
}

语言规范参考:可达性和明确赋值。

最新更新