注意:我意识到这是糟糕的代码;应该删除变量 valid ,并且while循环应该使用while(true)并让返回值突破它。但是,既然我正在努力学习编译器的工作方式,我认为这是适用的。
我在这里有一个非常有趣的困境。下面的代码显示用户的选项列表,并返回他们选择的选项。这失败,“并非所有代码路径都返回一个值(CS0161)”。
public static int Menu(params string[] list) {
string input;
bool valid = false;
while (!valid) {
for(int i = 0; i < list.Length; i++) {
Console.WriteLine(i + ": " + list[i]);
}
input = Console.ReadLine();
for (int i = 0; i < list.Length; i++) {
if (input == i.ToString()) {
valid = true;
return i;
}
}
}
//return -1;
}
但是,如果我取消注释 return -1 行,代码将正常运行,同时产生死代码; while循环只能在返回值的同时退出,并且始终返回。 (没有生成警告说这是无法访问的代码。)
为什么代码会失败,说它实际上并不总是返回一个值?
答案 0 :(得分:2)
编译器不检查变量的值。它只能看到你的while循环带有一个布尔变量
int Method {
while([a variable]) {
<Optional path>
}
<Path that is checked>
}
并注意到如果它是假的,那么你的方法就不会像它所说的那样返回一个int。
有关基于C#语言规范的更详细说明,请参阅this answer。