2011-05-18 224 views
0

可能重複:
variable scope in statement blocks爲什麼我會收到錯誤?

我有以下的C#代碼片段,但不工作

static void Main(string[] args) 
     { 
      if (true) 
      { 
       string name = "test"; 
      } 
      else 
      { 
       string name = "hello"; 
      } 
      string name = "world"; 
     } 

它給了我一個錯誤,指出 '名稱' 爲已在最後一行中聲明,但如果我更改它爲'name = "some string"說變量名稱未聲明。

+0

這個場景似曾相識......(不,這不是一個錯誤,它在SPEC) – BoltClock 2011-05-18 18:47:26

+0

@BoltClock和安東尼:關閉我的問題 – 2011-05-18 18:50:23

+0

這個問題已經被問了萬次。請在詢問之前搜索,人們! – dlev 2011-05-18 18:50:39

回答

3

您需要在IF之前聲明名稱變量。

static void Main(string[] args) 
     { 
      string name; 
      if (true) 
      { 
       name = "test"; 
      } 
      else 
      { 
       name = "hello"; 
      } 
      //name = "world"; 
     } 

最後一條語句被註釋掉了,因爲它會放棄對變量nameif語句來所做的任何更改。

+0

但是,這與他所擁有的不同,上面他有兩個變量局部於各自的if塊,並且具有一個局部於該函數的變量。 – zellio 2011-05-18 18:49:15

+0

這不是C - 並不代表他的代碼。 – Oded 2011-05-18 18:49:34

+0

沒有更多的上下文,這可能是OP想要的,或不... – Mr47 2011-05-18 18:50:04

5

C#中的範圍規則與C不相同 - 如果在外部範圍中聲明變量名稱,它是否在內部範圍之後聲明並不重要。

您聲明string name變量在if語句之外的事實意味着它在if/else的塊內可用。

編譯器正在抱怨,因爲您在if/else中聲明瞭具有相同名稱的其他變量。

如果您從最後一行刪除類型,那麼變量只在if/else的內部範圍內聲明,但它們在其之外是未知的,因此「變量名稱未聲明」錯誤。

下面將編譯就好:

static void Main(string[] args) 
    { 
     string name = "world"; 
     if (true) 
     { 
      name = "test"; 
     } 
     else 
     { 
      name = "hello"; 
     } 
    } 

這裏,變量在外部範圍聲明,所以在內部範圍可見的。你不是在內部範圍重新聲明它,所以沒有錯誤。

這是你想要的不清楚你的問題。

+0

@Oded:非常感謝您的答案... – 2011-05-18 18:55:17

+0

你確定編譯?我認爲你在聲明之前不能使用名字,儘管它在範圍之內。 – dlev 2011-05-18 18:56:36

+0

@Oded,不會編譯。在聲明之前,你會得到一個關於使用本地的錯誤。 – 2011-05-18 18:57:49

2

這是正確的。代碼中變量塊名稱相同的部分(稱爲declaration space)與其可訪問的區域(scope)不同。

特別是聲明空間包含聲明變量的整個塊。因此,您的name在外部塊中可以防止此塊或嵌套塊中的任何其他name變量。即在您的示例中,內部name的聲明空間和外部的name重疊導致編譯器錯誤,因爲任何標識符必須在其聲明空間內唯一。內部和外部的範圍不重疊。而且你不能在其範圍之外使用變量。

這是按設計和正確的規格。

上的差異退房埃裏克利珀的博客declaration spacescope之間: http://blogs.msdn.com/b/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx

命名實體的範圍是程序文本的區域中,它是合法的通過其不合格的指代實體名稱。
相比之下,聲明空間是程序文本的區域,其中不允許兩個實體具有相同的名稱。
總之,範圍回答了「我可以在哪裏使用這個名字?」的問題。和聲明空間回答了這個問題:「這個名稱在哪裏獨一無二?」

相關問題