这里有两条相关规则。
的第一个相关的规则是:
它是一个局部变量 声明空间和嵌套的局部 变量声明空间包含 元素具有相同名称的错误。
(而这个页面上的其他答案召唤出在我们再次调用此超出规定的其他位置。)
这仅仅是足以让这个非法的,但实际上第二个规则,使这一非法。
C#中的第二相关规则是:
对于在 表达式或声明给定 标识符作为简单名称的每次出现的 局部变量声明空间, 立即封闭块内,或者发生, 相同 标识符作为简单名称在 内的 表达式或声明每次其它出现时的 开关块立即封闭块或 开关 - 块必须参考相同的实体 。此规则确保名称含义在给定块,开关块, for-,foreach或using语句或匿名函数中始终是相同的 。
您还需要知道for循环被视为在整个事物中都有“隐形括号”。
现在我们知道,我们的注释代码:
public void MyMethod()
{ // 1
int i=10; // i1
{ // 2 -- invisible brace
for(int x=10; x<10; x++) // x2
{ // 3
int i=10; // i3
var objX = new MyOtherClass(); // objX3
} // 3
} // 2
var objX = new OtherClasOfMine(); // objX1
} // 1
你有三个 “简单名称”,I,X和物objx。你有五个变量,我标记为i1,x2,i3,objX3和objX1。
包含i和objX用法的最外面的块是块1.因此,在块1中,我和objX必须始终引用相同的东西。但他们没有。有时我指的是i1,有时它指的是i3。与objX一样。
然而,在每个块中只有x2意味着x2。
此外,“i”变量和“objX”变量都在同一个局部变量声明空间中。
因此,这个程序在几个方面是错误的。
在你的第二个程序:
public void MyMethod()
{ // 1
{ // 2 -- invisible
for(int x=10; x<10; x++) // x2
{ // 3
int i=10; // i3
var objX = new MyOtherClass(); // objX3
} //3
} // 2
{ // 4 -- invisible
for(int x=10; x<10; x++) // x4
{ // 5
int i=10; // i5
var objX = new MyOtherClass(); // objX5
} //5
} // 4
} // 1
现在你又有三个简单的名字,和六个变量。
首先包含简单名称x的用法的最外面的块是块2和块4.在块2中,x指的是x2。在整个方框4中,x指的是x4。因此,这是合法的。与我和objX一样 - 它们在方块3和5中使用,并且在每个方块中表示不同的东西。但是在同一个块中,没有任何一个简单的名字用来表示两个不同的东西。
现在,您可能会注意到考虑到块1的全部,x用于表示x2和x4。但是没有提到块1中的x,但不包含另一个块中的x。因此,我们不会将第1部分中的不一致用法计为相关。
此外,没有一个声明空间以非法的方式重叠。
因此,这是合法的。
谢谢你的描述。 – 2009-07-28 22:31:28
它很容易记住它作为一个规则...但一些如何不能消化为什么这是有限的,第一个代码和objX:我创建了一个块的变量,当我走出一个循环时,它打破了完成,就像我不能在块外访问它一样。 – 2009-07-28 22:36:28