为什么这段代码不能编译?
本文关键字:不能 编译 代码 段代码 为什么 | 更新日期: 2023-09-27 18:10:31
我不明白为什么这样的代码不能构建:
if (SomeCondition) {
Boolean x = true;
} else {
Boolean x = false;
}
Debug.WriteLine(x); // Line where error occurs
会产生以下错误:
名称'x'在当前上下文中不存在
对于我来说,在所有情况下都声明x
,因为有else
子句。那么为什么编译器不知道它在Debug.WriteLine
行?
x在writeline处超出作用域
这是由于变量的块作用域:{ int x = 3; }
仅在块内可见。你应该把x
的声明移出代码块:
Boolean x;
if (SomeCondition) {
x = true;
} else {
x = false;
}
Debug.WriteLine(x);
或者在上面的例子中,更好的是:
bool x = SomeCondition;
Debug.WriteLine(x);
变量只在声明它的块中有效:
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;
但我想这只是一个人为的例子来说明你的观点。
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);
在if-else块中定义的变量在if-else块之外不可用。
http://www.blackwasp.co.uk/CSharpVariableScopes.aspx你当然可以简化为:
Boolean x = SomeCondition;
Debug.WriteLine(x); // Line where error occurs
但是如果不需要在if语句之前声明变量所以它仍然在if语句之后的作用域内,像这样:
Boolean x;
if (SomeCondition) {
x = true;
} else {
x = false;
}
Debug.WriteLine(x);
x
只存在于它的作用域中,即if
块或else
块,不能在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);
使它在 if
之前存在并在之后继续存在
c#不是PHP。你必须在WriteLine的作用域中声明它。
你最好写:
Boolean x = SomeCondition;
Debug.WriteLine(x);