我不明白为什么这样的代码无法构建:
if (SomeCondition) {
Boolean x = true;
} else {
Boolean x = false;
}
Debug.WriteLine(x); // Line where error occurs
它会产生以下错误:
当前上下文中不存在名称“x”
对我来说,x
在所有情况下都被声明,因为有一个else
子句。那么为什么编译器不会在Debug.WriteLine
行知道呢?
答案 0 :(得分:8)
x超出了写作线的范围。
答案 1 :(得分:6)
这是由于阻止了变量的范围:{ int x = 3; }
仅在块中可见。您应该将x
的声明移到块外:
Boolean x;
if (SomeCondition) {
x = true;
} else {
x = false;
}
Debug.WriteLine(x);
或者在上述情况下,甚至更好:
bool x = SomeCondition;
Debug.WriteLine(x);
答案 2 :(得分:4)
变量仅在声明它的块中有效:
if (SomeCondition) {
Boolean x = true;
...
// end of life of Boolean x
} else {
Boolean x = false;
...
// end of life of Boolean x
}
当然,编译器可以推理
......但他们为什么要那样做?它使得编译器不必要地复杂化,只是为了涵盖这一特殊情况。
因此,如果您想在块外部访问x
,则需要在块之外声明它:
Boolean x;
if (SomeCondition) {
x = true;
} else {
x = false;
}
...
// end of life of Boolean x
当然,在这种特殊情况下,写起来要容易得多:
Boolean x = someCondition;
但我想这只是一个举例说明你的观点。
答案 3 :(得分:2)
Boolean x
的定义仅存在于定义的范围内。我已经注意到以下范围:
if (SomeCondition) { //new scope
Boolean x = true;
} // x is not defined after this point
else { //new scope
Boolean x = false;
} // x is not defined after this point
Debug.WriteLine(x); // Line where error occurs
最好的方法是在外面声明变量:
Boolean x = false;
if (SomeCondition) {
x = true;
}
else {
x = false;
}
Debug.WriteLine(x);
答案 4 :(得分:2)
if-else块中定义的变量在其外部不可用。
答案 5 :(得分:1)
您当然可以简化为:
Boolean x = SomeCondition;
Debug.WriteLine(x); // Line where error occurs
但是如果不必在if语句之前声明变量,那么它仍然在if语句之后的范围内,如下所示:
Boolean x;
if (SomeCondition) {
x = true;
} else {
x = false;
}
Debug.WriteLine(x);
答案 6 :(得分:1)
x
仅存在于其范围内,if
块或else
块, not if
语句后完了。虽然它是创建的,无论执行哪个块,它都会在到达调试语句之前在该块的末尾被销毁。
if (SomeCondition) {
Boolean x = true; <-- created here
} <-- destroyed here
else
{
Boolean x = false; <-- created here
} <-- destroyed here
Debug.WriteLine(x); <-- does not exist here
您可以将其更改为:
Boolean x;
if (SomeCondition) {
x = true;
} else {
x = false;
}
Debug.WriteLine(x);
以便在<{em> if
之前将其存入并继续进行。
答案 7 :(得分:0)
C#不是PHP。你必须在WriteLine的范围内声明它。
你最好写:
Boolean x = SomeCondition;
Debug.WriteLine(x);