我编写了一个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;
答案 0 :(得分:3)
问题是您只是有条件地调用CreateTree
。假设parsingIsTotal
为假 - 那么这个表达式:
parsingIsTotal && CreateTree(...)
将评估左手操作数,发现它是假的,不评估右手操作数。
您提出的修补程序会出现同样的错误,原因恰恰相同 - 您使用的是t
,但t
并未明确分配,因为{{ 1}}可能没有被调用。
如果总是想要调用CreateTree
而不管CreateTree
之前的值,那么最简单的解决方案就是:
parsingIsTotal