2015-12-09 55 views
0

我對一個事實感到困惑:C#範圍和知名度

在說明書中說:

一個名字的範圍是程序文本的區域內,它是 可以參照以名稱申報的實體無名稱 的資格。

然後

在 局部變量聲明(第8.5.1節)中聲明的局部變量的範圍是其中 聲明所在的塊。

然後

在局部變量的範圍內,它是一個編譯時間錯誤 指局部變量在先於 的局部變量聲明的文本位置局部變量。

所以起初它說局部變量的範圍是塊,最後它說一個局部變量只有在聲明後纔可用(就像在C/C++中一樣)。

那麼是否存在任何矛盾,或者我不明白規範的意思?

+5

局部變量在範圍內,但如果事後聲明則不能訪問它。這個編譯器錯誤應該可以防止你不小心的錯誤。你爲什麼要使用這個時候沒有聲明的變量?您始終可以將聲明移至方法的頂部。 –

+2

我看到的是免費的陳述而不是矛盾的陳述。變量作用域被定義爲它所在的塊,但只是從聲明它的那一點開始。 –

+2

第一個引用與* local *變量無關,後面兩個是。第一個引用是關於範圍是什麼的一般定義。第二個描述* local *變量作用域的行爲。第三個人簡單地指出,寫作是非法的:'a = 1; int a = 2;' – Rob

回答

4

沒有矛盾。

甲變量的範圍是在其中定義,它只能用於它被聲明的區域。

這樣:

{ 
    int someVariable; 
    ... 
    someVariable = 0; 
    ... 
} 

是有效的。鑑於:

{ 
    int someVariable; 
    ... 
} 
someVariable = 0; 

是不是。而且,無論是:

{ 
    someVariable = 0; 
    ... 
    int someVariable; 
} 
3

一個名字的範圍是程序文本的區域內,它可能是指不名的資格由名稱聲明的實體。

該規則規定,鑑於:

public static class TestClass 
{ 
    public static int Value { get; set; } 
    public static string ValueString 
    { 
    get { return TestClass.Value.ToString(); } 
    } 
} 

我們可以省略的ValueTestClass資質ValueString因爲Value的範圍是:

public static class TestClass 
{ 
    public static int Value { get; set; } 
    public static string ValueString 
    { 
    get { return TestClass.Value.ToString(); } 
    } 
} 

但是,如果我們也有:

public static void TestMethod() 
{ 
    TestClass.Value = 3; 
} 

然後我們不能刪除TestClass.部分,因爲範圍內沒有Value

局部變量聲明(§8.5.1)中聲明的局部變量的範圍是發生聲明的塊。

考慮:

if (true) 
{ 
    int x = 3; 
} 

x++; // CS0103 The name 'x' does not exist in the current context 

我們得到CS0103編譯錯誤,因爲我們正在嘗試使用x的地方在那裏x不存在。

在局部變量的範圍內,在局部變量的局部變量聲明符之前的文本位置引用局部變量時出現編譯時錯誤。

if (true) 
{ 
    x++; // CS0841 Cannot use local variable 'x' before it is declared 
    int x = 3; 
} 

在這裏,我們得到一個CS0841錯誤信息。 x存在於此範圍內,因此您引用的第二條規則正在遵循。它在宣佈之前就已經被使用了,所以你引用的第三條規則並沒有被遵守。不同的編譯錯誤反映了不同的規則已被破壞的事實。