为什么这段代码不能编译?

本文关键字:不能 编译 代码 段代码 为什么 | 更新日期: 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);