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

时间:2011-10-06 13:20:57

标签: c#

我不明白为什么这样的代码无法构建:

if (SomeCondition) {
    Boolean x = true;
} else {
    Boolean x = false;
}
Debug.WriteLine(x);     // Line where error occurs

它会产生以下错误:

  

当前上下文中不存在名称“x”

对我来说,x在所有情况下都被声明,因为有一个else子句。那么为什么编译器不会在Debug.WriteLine行知道呢?

8 个答案:

答案 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块中定义的变量在其外部不可用。

http://www.blackwasp.co.uk/CSharpVariableScopes.aspx

答案 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);