2016-02-13 56 views
2

不知道这是因为C#编译器是多余的挑剔,但我尝试做这在C#:为什么我不能在C#中的不同范围内声明一个具有相同名称的变量?

public static void Main() 
{ 
    bool result = true; // some dummy value 
    if(result) 
    { 
     int x = 5; 
     Console.WriteLine(x); 
    } 

    int x = 10; 
    Console.WriteLine(x); 
} 

编译器会抱怨,变量名“X”已被使用:

一个名为'x'的局部变量不能在这个范围内声明,因为它 会给'x'赋予不同的含义,'x'已经在 的'子'范围中用来表示别的东西。

我明白它认为这是一个范围问题,但它为什么这么认为?

如果我在Java中重现相同的代码,则没有问题。

回答

1

不是每个{}开始一个新的范围。在if块中声明的整数与函数仍然在同一栈中。

+0

所以你把它复制,并在同一时间回答一下.. –

+0

@AlexJolig - 它需要5票关闭,这是一个有效的答案。 – Tommy

+0

我做了一个快速的回答后,我做了一个搜索,找到了更好的答案。 –

0

我认为这更明显,为什么如果您将x的外部声明移到if语句之上。

public static void Main() 
{ 
    bool result = true; // some dummy value 

    int x = 10; 

    if(result) 
    { 
     //references x in parent scope 
     x = 5; 
     //x is already defined, can't define again 
     int x = 5; 
     Console.WriteLine(x); 
    } 

    Console.WriteLine(x); 
} 

显然,编译器会看到x为这已经是if语句内部定义时,代码试图再次声明一个变量。

+0

是的,那在Java中就是这样。但是Java的顺序很重要 - 上面的例子在那里工作。我猜C#编译器有点挑剔。 –

+0

啊,是的,忘了你说过它在Java中工作。 java编译器显然没有与其他答案中列出的规则相同的规则。 – mclaassen

1

从MSDN Compiler Error CS0136

对于在 表达式或声明一个给定的标识符作为一个简单名称的每次出现,局部变量声明空间内 (第3.3节)直接封闭该发生,每一个其他与表达式或声明符 中的简单名称相同的标识符的出现 必须引用同一个实体。此规则确保在给定块,开关块,for-, foreach或using语句或匿名函数内名称的含义始终相同。

作为第二参考,检查Variable scope confusion in C#答案,你可以找到很好的信息。

你被允许在非重叠 范围使用相同的变量名。但是,如果一个范围与另一个范围重叠,则不能在两者中声明相同的变量。其原因是为了防止你 从内部 范围

1

由于@BlackFrog正确地指出,每个{ }不启动新的作用域不小心使用已经使用的变量名。从C#语言规范§3。3:

•每个方法声明索引器声明运算符声明实例构造函数声明匿名函数创建一个新的声明空间称为局部变量声明空间。通过形式参数(固定参数和参数数组)和类型参数将名称引入此声明空间。函数成员或匿名函数的主体(如果有)被认为嵌套在局部变量声明空间中。 局部变量声明空间和嵌套局部变量声明空间包含具有相同名称的元素是错误的。

(重点煤矿)

相关问题