不确定这是否是因为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'的局部变量不能在此范围内声明,因为它 对于已经在a中使用的' x'会有不同的含义 '儿童'范围表示别的东西。
我知道它认为这是一个范围问题,但为什么会这么想?
如果我在Java中重现相同的代码,则没有问题。
答案 0 :(得分:1)
并非每个{}
都会启动新范围。 if块中声明的整数仍与函数位于同一堆栈中。
答案 1 :(得分:1)
来自MSDN Compiler Error CS0136
对于给定标识符的每次出现,作为简单名称 表达式或声明符,在局部变量声明空间内 (§3.3)在每次出现时立即封闭该事件 与表达式或声明符中的简单名称相同的标识符 必须指同一实体。这条规则确保了a的含义 在给定的块,switch块,for-中,name始终是相同的, foreach-或using-statement,或匿名函数。
作为第二个参考,请查看Variable scope confusion in C#个答案,您可以在这些答案中找到好的信息。
您可以在非重叠中使用相同的变量名称 范围。但是,如果一个范围与另一个范围重叠,则不能拥有 两者都声明了相同的变量。原因是为了阻止你 意外地在内部使用已经使用过的变量名 范围
答案 2 :(得分:1)
正如@BlackFrog正确指出的那样,每个{ }
都没有启动新范围。来自C#语言规范,§3.3:
•每个方法声明,索引器声明,运算符声明,实例构造函数声明和匿名function 创建一个名为局部变量声明空间的新声明空间。通过形式参数(固定参数和参数数组)和类型参数将名称引入此声明空间。函数成员或匿名函数的主体(如果有)被认为嵌套在局部变量声明空间中。 局部变量声明空间和嵌套局部变量声明空间包含具有相同名称的元素是错误的。
(强调我的)
答案 3 :(得分: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语句中定义。