這裏有兩條相關規則。
的第一個相關的規則是:
它是一個局部變量 聲明空間和嵌套的局部 變量聲明空間包含 元素具有相同名稱的錯誤。
(而這個頁面上的其他答案召喚出在我們再次調用此超出規定的其他位置。)
這僅僅是足以讓這個非法的,但實際上第二個規則,使這一非法。
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