可能重复:
C# Variable Scoping
我认为如果在不同的范围内,我可以声明两个具有相同名称的变量:
namespace IfScope
{
class Demo
{
public static void Main()
{
bool a = true;
if ( a )
{
int i = 1;
}
string i = "s";
}
}
}
编译器说了别的话:
$ csc Var.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
Var.cs(13,20): error CS0136: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else
这意味着在if中声明的i
在外面是可见的(这就是我所理解的)
但如果我尝试使用它,那我就明白了。
$ cat Var.cs
namespace IfScope
{
class Demo
{
public static void Main()
{
bool a = true;
if ( a )
{
int i = 1;
}
i = "s";
}
}
}
Var.cs(13,14): error CS0103: The name 'i' does not exist in the current context
显然,但是这里发生了什么?
答案 0 :(得分:3)
C#要求一个简单的名称在首次使用它的所有块中都有一个含义。From here.
来自规范。
对于给定标识符的每次出现,作为表达式或声明符中的简单名称,在该出现的局部变量声明空间内,每个出现的同一标识符与简单名称相同表达式或声明符必须引用同一个实体。此规则确保名称的含义在给定块,switch块,for-,foreach-或using-statement或匿名函数中始终相同。
答案 1 :(得分:-1)
标识符i仅在if内可见,但其范围是整个方法。这意味着一旦方法启动,我识别的变量就会存在。这是因为当时必须分配内存。是否在堆栈上分配内存的决定不能在运行时进行,因此条件块内的所有变量都是在控制进入if之前创建的,并且变量存在直到方法返回。