请考虑以下代码示例:
// line #
{ // 1
// 2
{ // 3
double test = 0; // 4
} // 5
// 6
double test = 0; // 7
} // 8
这给出了错误
名为'test'的局部变量不能在此范围内声明,因为它会给'test'赋予不同的含义,'test'已在'child'范围内用于表示其他内容
但我不明白为什么?外部测试变量从第7行开始,而不是在第2行,所以在第4行声明第二个变量名为test的问题,其中范围以第5行结束?
答案 0 :(得分:10)
变量的范围在它们声明的块中,它们在哪一行并不重要。
阅读C#语言规范中的scopes。
来自规范:
在local-variable-declaration(Section 8.5.1)中声明的局部变量的范围是声明发生的块。
和
范围可以嵌套,内部范围可以从外部范围重新声明名称的含义。 (但是,这并没有消除3.3节规定的限制,即在嵌套块中,不可能声明一个与封闭块中的局部变量同名的局部变量。)
答案 1 :(得分:3)
这是一个经常被问到的问题;另见:
C# going nuts when I declare variables with the same name as the ones in a lambda
Variable scope confusion in C#
答案是:更仔细地阅读错误消息。错误消息准确说明了问题所在:不允许您使用相同的简单名称来表示同一块中的两个不同内容。
例如:
class C
{
int x;
void M()
{
int x;
}
}
完全合法。请注意,外部x 的范围重叠内部x的范围。在两个范围内具有相同名称的重叠范围是不非法。
这不合法:
class C
{
int x;
void M()
{
Console.WriteLine(x); // this.x
{
int x;
}
}
}
同样,两个具有x重叠的范围完全合法。非法的是简单名称x在同一个块中使用两个平均两个不同的变量 - 即在M()的外部块中,其中包含 M的内部块。
使用相同简单名称 表示同一块中的两个不同内容的程序令人困惑和容易出错,因此< em>非法在C#中。
有关详细信息,请阅读我关于此主题的文章:
http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/
答案 2 :(得分:0)
+1,我同意你的意见,但这并不是规范的编写方式。它使编写编译器更容易我确定。此外,我认为可以说最好不要这样做,以使代码更容易理解。