2012-01-19 17 views
5

可能重複:
Child Scope & CS0136
C# Variable Scoping如何在C#局部範圍以外的工作

雖然我一直在使用C#相當長的一段時間裏,我只是在這個錯誤絆倒。

如果我有以下幾點:

if(true) 
{ 
    int x = 0; 
} 
int x = 0; 

我得到一個錯誤,指出:A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a child scope to denote something else.

如果我這樣做:

if(true) 
{ 
    int x = 0; 
} 
x = 0; 

我得到一個錯誤,指出:The name 'x' does not exist in the current context.

我可以理解有一個或另一個,但爲什麼這兩個這些錯誤是否存在?有沒有解決第一個選擇的方法?我覺得很煩人。

謝謝。

+0

請參閱http://stackoverflow.com/a/296780/870604 – ken2k

+0

@評論:是的,對不起。猜猜我應該先做一些搜索......: -/ – Eric

+0

@Eric,以防萬一你真的想讓自己和其他人感到痛苦和痛苦,下面是一些類似x的人物的例子C#中的有效標識符:'intҲ,ҳ,א,ẋ,ẍ;'我相信如果您選擇將這些字符混合到您的源代碼中,以後沒有人會感謝您。 :)(以防止任何人閱讀此內容...請不要使用這些異國情調的字符,以便您可以使用類似外觀的名稱具有不同的變量) –

回答

6

內定義這兩個錯誤都可以阻止您犯錯或導致您的同事想要殺死您。

第一次失敗,因爲它在同一時間範圍內有兩個同名的局部變量令人困惑。

第二次失敗,因爲變量的作用域是if語句,並且您試圖在該範圍之外訪問它。

如果你想,你可以同時使用內部和外塊一個變量,你只需要之前聲明它塊:

int x; 
if (true) 
{ 
    x = 0; 
} 
x = 0; 

如果你真的想兩個獨立的變量是在(同一時間內),然後給他們不同的名字 - 從而避免以後的混淆。

編輯:你可以在一個方法中聲明多個具有相同名稱的局部變量,但他們必須有單獨的作用域。例如:

public void Foo(IEnumerable<string> values) 
{ 
    double sum = 0; 
    foreach (string x in values) 
    { 
     int z = x.Length; 
     sum += z; 
    } 

    foreach (string x in values) 
    { 
     double z = double.Parse(x); 
     sum += z; 
    } 
} 

我個人不傾向於經常使用這個能力 - 至少不能與不同類型的 - 當變量具有有意義的名稱和方法很短。但是這絕對是合法的,有時候肯定會有用。

+0

@Jon:願意冒險在同一個函數中是否可以有'int'和'double'命名爲'x'? – Eric

+1

@Eric:是的,但不在同一範圍內。會添加一個例子。 –

3

在第一種情況下,問題在於{ }塊之外的int x塊具有包含{ }內的上下文的全局範圍;因此您將重新聲明一個具有相同名稱的變量。

在第二種情況下, x不存在,因爲它只在{ }

相關問題