2012-09-21 33 views
7

通常情況下,如果我使用開關在C#中枚舉,我不得不寫類似的東西:是有一個警告(錯誤),類似於C4061爲C#

switch (e) 
{ 
    case E.Value1: 
     //... 
     break; 

    case E.Value2: 
     //... 
     break; 

     //... 
    default: 
     throw new NotImplementedException("..."); 
} 

在C++(用於VS)我可以爲該開關啓用警告C4061和C4062,使其發生錯誤並進行編譯時檢查。在C#中,我必須將此檢查移到運行時...

有誰知道如何在C#我可以在編譯時檢查此問題嗎?也許有警告,默認禁用,我錯過了,或者其他方式?

+2

請解釋對於那些不熟悉C++ Cxyz的警告的警告。 –

+0

它們在msdn中有很好的解釋。簡而言之,在C++代碼中,如果啓用它們,可以使用「switch」進行枚舉,並忘記處理某些枚舉值(在單獨的「case」中)在編譯 – Alek86

回答

5

不,沒有編譯時檢查 - 只有處理一些命名值的開關/情況纔是合法的。這可能是可能包括它,但也有一些問題。

首先,它是完全有效的(不幸的是),用於枚舉值不具有任何的「命名」值:

enum Foo 
{ 
    Bar = 0, 
    Baz = 1 
} 
... 
Foo nastyValue = (Foo) 50; 

鑑於任何值是開關/殼體內可行的,編譯器不知道你不是想要處理一個未命名的值。

其次,它不適用於Flags枚舉 - 編譯器並不真正知道哪些值是方便的組合。它可能推斷,但它會有點噁心。

第三,它並不總是你想要的 - 有時你真的只想迴應幾個案例。我不想在合理的定期基礎上壓制警告。

您可以使用Enum.IsDefined來檢查此事件,但效率相對較低。

我同意,所有的這是一個痛苦的一點 - 枚舉是有點討厭的區域,當涉及到.NET :(

+2

時出現警告,但我不同意「不,不能有編譯時檢查」。在C++中,你可以設置任何值來枚舉枚舉,但是有機會檢查,處理所有預期值 – Alek86

+0

@ Alek86:好的,將會在此編輯。 –

+0

也許你知道回合一些第三方工具(如StyleCop)可以檢查這個? – Alek86