2016-02-12 13 views
7

Jestem stoi ten mały kawałek kodu:#if DEBUG i instrukcja powrotu - nieosiągalny kod ostrzegawczy

#if DEBUG 
return thisVariable; 
#endif 
return thatVariable; //<-- warning CS0162 here 

To działa dobrze, z wyjątkiem otrzymuję ostrzeżenie na drugim instrukcji return, że kod jest nieosiągalny. Pomimo ostrzeżenia, kod jest rzeczywiście bardzo osiągalny podczas uruchamiania programu w trybie zwolnienia.

Dlaczego otrzymuję to ostrzeżenie?

+0

W jakiej konfiguracji masz program Visual Studio? – Maarten

+0

To zniknie, gdy umieścisz go w wydaniu –

+4

Dodaj #else przed powrotem 2 ° i #endif po –

Odpowiedz

13

Jeśli wykonywana jest kompilacja, w której zdefiniowano symbol DEBUG, wówczas kompilator wykonuje analizę statyczną kodu , zakładając, że pierwszy zwrot jest aktywny i nie jest wykluczany. Więc twój kod byłby postrzegany jako:

return thisVariable; 
return thatVariable; 

W tym kontekście jasne jest drugi return oświadczenie nie zostanie osiągnięty w takiej kompilacji. Po przełączeniu do konfiguracji kompilacji, w której DEBUG nie jest zdefiniowany, nie powinno być wyświetlane ostrzeżenie.

Należy rozważyć użycie #else (docs), aby uniknąć drugiej instrukcji return, gdy zdefiniowano DEBUG.

Jest też to istotne smakołyk z here:

Mimo że kompilator nie ma osobnego preprocesor, że dyrektyw opisane w niniejszym [C# dyrektywy preprocesora] sekcji są przetwarzane tak, jakby były jednym.

Innymi słowy, analiza statyczna kompilatora C# nie jest świadoma dyrektyw preprocesora; zostały już przetworzone w tym momencie, a analiza statyczna widzi tylko kod, który uzyskał z fazy przetwarzania wstępnego.

+1

Dziękujemy! użycie #else dla drugiej instrukcji return i umieszczenie #endif poniżej usunęło ostrzeżenie. – Richnau