out 参数通过将其作为 out 参数传递给另一个函数来分配

out parameter assigned by passing it to another function as an out parameter

我写了一个树结构,然后做了一个静态函数来尝试从源文件中解析树。

public static bool TryParseTreeFromFile(String filePath, out Tree tree) {
    String fileContent;
    using (StreamReader reader = new StreamReader(filePath, true)) {
        fileContent = reader.ReadToEnd();
    }

    List<NodeDescription> nodesDescription;
    List<TreeLevelDescription> levelsDescription;
    bool parsingIsTotal = ExtractInformationFromFile(fileContent, out nodesDescription, out levelsDescription);

    parsingIsTotal = parsingIsTotal && CreateTree(nodesDescription, levelsDescription, out tree);

    return parsingIsTotal;
}

TryParseTreeFromFile、ExtractInformationFromFile和CreateTree都是return一个boolean并取出参数的函数(这样我们就可以从文件中解析所有可以解析的东西,同时也通知源文件中的所有信息是否可以被解析)。

无论如何这个函数给我一个编译错误:"The out parameter 'tree' must be assigned to before control leaves the current method"。事件,以便 CreateTree 将分配它。

我当然可以添加 Tree t;,将其传递给 CreateTree 函数,然后将其分配给树,但我想了解为什么会发生这种情况,为什么设计师必须禁止这样做。

编辑:修改声明树的函数,将其传递给 CreateTree,然后将树分配给该变量也不起作用:Use of unassigned local variable 't'

Tree t;
parsingIsTotal = parsingIsTotal && CreateTree(nodesDescription, levelsDescription, out t);
tree = t;   

问题是您只是有条件地 调用 CreateTree。假设 parsingIsTotal 为假 - 那么这个表达式:

parsingIsTotal && CreateTree(...)

会计算左边的操作数,发现它是假的,不会计算右边的操作数。

出于完全相同的原因,您在建议的修复中遇到了同样的错误 - 您正在使用 t,但未明确分配 t,因为 CreateTree 可能没有被调用。

如果您 总是 想调用 CreateTree 而不管 parsingIsTotal 的先前值,最简单的解决方案就是:

parsingTotal &= CreateTree(nodesDescription, levelsDescription, out tree);