2015-10-23 22 views
2

我有多個個案switch語句:的Visual Studio剛過標誌着碼「情況變量:」無法訪問

ConversionState state = ConversionState.Start; // enum 
for(int i = 0; i < source.Length; i ++) 
{ 
    switch(state) 
    { 
     case ConversionState.Start: 
      state = ConversionState.Name; // <-- warning here 
      name += source[i]; // source is a string 
      break; 
     case ConversionState.Name: 
      if(source[i] == ' ') // <-- warning here 
      { 
       name = name.ToLower(); 
       if(name[0] == '/') 
        name = name.SubString(1); 
       state = ConversionState.Between; 
      } 
      else 
       name += source[i]; 
      break; 
     case ConversionState.Between: // no code in this case statement, yet to be implemented 
      break; // <-- warning here 
    } 
} 

我得到三個標線的警告:「檢測不到的代碼」。案件之後的第一個陳述不可能無法達到,可以嗎?我的問題是:

  1. 是我的代碼有問題,或者是警告錯誤?

  2. 如果VS2015認爲代碼片段不可訪問,當我編譯優化時會被刪除嗎?如果不是,我應該忽略這個警告嗎?

  3. 此警告是否意味着標記的行不可訪問,或者整個案例無法訪問?

PS:我知道,當前的代碼可以不帶開關被改寫,這將解決這個問題,但是這將增加未來代碼將使 - 了 - 更容易使用開關來維持。

編輯(由阿米特dayama要求):

private enum ConversionState 
{ 
    Start, Between, Name, Argument, Switch 
} 

枚舉是具有包含最初發布代碼的方法的類中。

編輯2: 此代碼的方法的第一行是throw new NotImplementedException();。顯然,這使得Visual Studio在方法不可達的每個開關中標記每個事件的第一行,但沒有其他事件,並且有趣的是,不是異常之後的整個代碼。

+1

,請複製粘貼更多的代碼。沒有在我的機器再現(VS 2015)。 – qxg

+0

什麼是給這個警告?我沒有從VS也沒有從resharper得到任何東西。還我沒有看到在給定的代碼任何理由,實際上導致無法訪問的代碼問題 –

+1

你能證明你的枚舉? –

回答

1

我已經檢查了你的代碼,並且使用VS2012編譯和構建了我的一切。我現在VS2015有一些問題,在錯誤列表窗口中有很多誤報。

所以問題1:從我這邊看,你的代碼是正確的。

問題2:不完全確定,但認爲id不會將其刪除以優化。我可能是錯的,但是警告的原因是你解決它而不是編譯器。當我爲你找到正確答案時,我會添加評論。

問題3:行不是全部情況。 PS:也許你可以嘗試添加大括號到你的if和else語句中。我知道他們不是一個襯墊所必需的,但他們可能會導致VS2015中的特定行爲

+0

謝謝。如果代碼優化不能消除它,我想我可以忍受這3個額外的警告。 – sisisisi

+0

是的,你可能最有可能忍受它。這取決於開發人員。大多數情況下,這些問題可能會在VS2015的下一個版本中得到解決,如果問題來自於這個問題。 – Theunis

0

這對我來說似乎很奇怪。 首先,我不知道ConversationState的屬性是什麼。 如果它來自Lync API,則屬性看起來不正確,實際是活動,停放,非活動和終止。

所以我會做這樣的

ConversionState state = ConversationState.Active; 
for(int i = 0; i < source.Length; i ++) 
{ 
    switch(state) 
    { 
    case ConversationState.Active: 
     state = ConversionState.Name; 
     name += source[i]; 
     break; 
    case ConversationState.Inactive: 
     if(source[i] == ' ') 
     { 
     name = name.ToLower(); 
     if(name[0] == '/') 
      name = name.SubString(1); 
     state = ConversionState.Between; 
     } 
     else 
     name += source[i]; 
     break; 
} 

問題似乎正在使用的情況下,形式錯誤的一個開關箱。如果我錯了,請糾正我。

+0

它是'ConversionState',而不是'ConversationState'。另外,OP的大小寫語法也沒有錯。編輯:好的,我原來也是來自特里爾;) – InvisiblePanda

1

您在正在被在switch聲明手工檢查爲ConversionState.Start

這是相當簡單的,既然沒有代碼來改變這個switch語句之前,Visual Studio將迎來另一些情況下爲不可達的變量碼。

如果我沒有弄錯Visual Studio(或者您使用的插件?)看不到用於switch語句的變量正在被更改,因此會拋出警告。 並回答問題

如果VS2015認爲一個代碼片段是無法訪問外,其餘是否得到去除 當我與優化編譯?如果不是,我應該忽略 這個警告嗎?

據我知道的一個警告的警告。它不會干擾你的代碼的最終結果。它警告你可能有錯。

此警告是否意味着標記線路不可用,或者說整個情況是無法到達的?

整個案件不可達。在這種情況下,控制流將永遠不會得到,所以內部的所有代碼都不會被執行。

編輯從代碼審查方面,你的代碼是讓人有些困惑。您使用特定的案例來運行source集合中的第0個元素。爲什麼不在第0個元素上執行該代碼並從下一個元素開始循環?

+0

感謝您指出,我將刪除'Start'並將它放在for循環之前或將它與'Name'合併。我沒有15的聲望,所以如果我提出了一個答案,就不能看到它,但是如果我提高了答案的話,就不會看到它。 – sisisisi

+0

@sisisisi你現在有:-P –