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

时间:2015-06-12 07:11:53

标签: .net-3.5 out

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

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都是返回布尔值和取出参数的函数(这样我们就可以解析可以从文件中解析的所有内容,但是如果可以解析源文件中的所有信息,也会通知)。 p>

无论如何,这个函数给我一个编译错误:“必须在控制离开当前方法之前将out参数'tree'赋值给”。事件,因此CreateTree将分配它。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

parsingIsTotal && CreateTree(...)

将评估左手操作数,发现它是假的,评估右手操作数。

您提出的修补程序会出现同样的错误,原因恰恰相同 - 您使用的是t,但t并未明确分配,因为{{ 1}}可能没有被调用。

如果总是想要调用CreateTree而不管CreateTree之前的值,那么最简单的解决方案就是:

parsingIsTotal