2010-01-13 37 views
14

我一直想知道爲什麼在C#中使用以前在子範圍中使用的變量名稱是不允許的。就像這樣:使用在子範圍中使用的變量名稱

if (true) 
{ 
    int i = 1; 
} 

int i = 2; 

編譯上面的代碼產生一個錯誤:

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

可是你不能使用兒童範圍內定義任何變量。上面的代碼在Java中工作得很好,我也沒有看到爲什麼它不在C#中。我確定有一個很好的理由,但它是什麼?

回答

14

這是一個由C#設計人員設計的選擇。它減少了潛在的歧義。

您可以在if或outside之外的兩個位置之一使用它,但只能在一個位置定義它。否則,您會發現編譯器錯誤。

+0

我其實認爲會有一個「真正」的原因,因爲我真的不明白爲什麼會有人做出這樣的選擇。 :D但是我確實看到了這一點,很高興知道原因。 – Carlos 2010-01-13 19:21:20

+0

khilon:我真的認爲真正的原因是我所建議的;^_^ – Toad 2010-01-13 19:22:46

+1

@Carlos fyi,_real_的原因是所有變量聲明都在某個時間點(編譯或JIT)移動到其範圍的頂部。因此,您的範圍與您的聲明有關的排序很少,在運行時,子/祖範圍衝突永遠是衝突。編譯器提前拒絕它。 – Gusdor 2014-12-12 12:11:14

0

根據所有可能性,任何子範圍中創建的任何變量將在輸入方法時置於堆棧框中。

這樣,子範圍中的類似名稱不能與另一個子範圍中的變量名共存。

他們可以解決此工作過,當然,如果他們想要的東西,所以我想它最終必須做的設計以及..這樣有錯誤

1

正如亞當·克羅斯蘭說的機會少,這是一個設計選擇 - 確保您(或更有可能的是,您的開發人員)不會誤解代碼。

你經常會看到一個「M_」或前綴私人實例成員「_」(如_myVar或m_myVar),以避免混淆..

3

東西,我注意到,這不是這裏要注意。這編譯:

for (int i = 0; i < 10; i++) 
{ 
    int a = i * 2; 
} 
for (int i = 0; i < 5; i++) 
{ 
    int b = i * 2; 
} 

總之,這些設計決策似乎不一致,或者至少限制怪異和寬容,分別。

+0

「爲什麼我可以在同胞作用域中使用相同的變量」應該是註釋或其他問題。這篇文章並不是真正的答案,因爲這篇文章談到了兄弟姐妹範圍,與原來的問題(子/父範圍)不同。 – 2014-11-07 15:13:34

+0

我同意。我試圖通過指出與原始問題有關的C#範圍問題來增加知識,但不幸的是,由於我的代表太低,我無法將其作爲評論發佈。 – jeffmk 2014-11-14 02:16:48

+0

我真的看不出什麼錯,它編譯時出了什麼問題? – 2016-04-21 08:59:22