只是为了澄清,这里违反了两条规则。
第一个是嵌套的局部变量声明空间可能不包含两个相同名称的声明。
二是嵌套本地范围可能不包含相同简单的名称或声明的两种用法是指两个不同的东西。
这两个规则都被违反了。请注意,第一条规则基本上是第二条规则的特例。第二条规则更一般;例如,这也是一个违规:
class C
{
int x;
void M()
{
if (whatever)
{
string x = "";
}
x = 10;
}
}
这里简单名称x
用于表示在一个本地作用域this.x
和在嵌套范围局部变量x
。这很混乱;在整个块中需要一个简单的名称来表示相同的事物。因此我们认为它是非法的。这将是合法的:
class C
{
int x;
void M()
{
if (whatever)
{
string x = "";
}
}
}
即使局部变量被嵌套在该领域的范围内的范围内声明的,这是允许的,因为该领域的范围是不是一个局部变量声明空间。
这也是合法的:
class C
{
int x;
void M()
{
if (whatever)
{
string x = "";
}
else
{
x = 2;
}
}
}
因为现在的x
两个相互矛盾的用法都始终贯穿其直接包含范围的条款内容使用。那些范围现在不重叠,所以这是允许的。 (然而,这仍然是一个糟糕的主意。)
这些规则是为了您的安全,但它们可能会令人困惑。见
http://blogs.msdn.com/b/ericlippert/archive/tags/declaration+spaces/
和
http://blogs.msdn.com/b/ericlippert/archive/tags/scope/
对这些语言特性的文章。
顺便说一句,这是_C#_,而不是.Net。 .Net没有范围的概念。 – SLaks 2012-03-14 15:43:18
http://msdn.microsoft.com/en-us/library/ms973875.aspx – 2014-01-13 15:18:57