2012-09-21 13 views
7

ためのC4061のような警告(エラー)が、私はC#で列挙型用のスイッチを使用している場合、私はそのような何かを記述する必要があり、このスイッチの警告C4061とC4062を有効にし、エラーにしてコンパイル時のチェックを行います。 C#では、このチェックを実行時に移動する必要があります。通常C#

C#でどのように知っていますか?これはコンパイル時にチェックすることができますか?たぶん、デフォルトで無効になっている警告が表示されています。

+2

に来るとき、列挙型は、厄介なエリアの少しあるC++ Cxyz-警告に慣れていない人のための警告を説明してください。 –

+0

彼らは非常によくmsdnで説明されています。いくつかの言葉では、C + +コードでは、それらを有効にする場合は、いくつかの列挙のために "スイッチ"を使用し、列挙値の一部を処理することを忘れて(別の "ケース")コンパイル中の警告 – Alek86

答えて

5

いいえ、コンパイル時のチェックはありません。名前付きの値の一部しか処理しないスイッチ/ケースがあるのは正当です。それを含めるにはが可能でしたが、いくつかの問題があります。

まず、それは「名前付き」の値のいずれか持たない列挙型の値のために(残念ながら)完全に有効です:

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

任意の値はスイッチ/ケース内に実現可能であることを考えると、コンパイラに名前のない値を扱おうとしていないことを知ることはできません。

第2に、Flags enumsではうまくいきません。コンパイラは、どちらの値が便利な組み合わせであるかを実際にはわかりません。それはそれを推測することができますが、それは少し嫌なことになります。

第3に、必ずしもあなたが望むものではありません。実際には、ほんのわずかの場合にしか対応したくない場合があります。私は、合理的に定期的に警告を抑制する必要はありません。

Enum.IsDefinedを使用すると、これを確認できますが、それは比較的効率が悪いです。

私はこのすべては、痛みのビットであることに同意 - それは、.NET :(

+2

ありがとうございます。しかし、私は "いいえ、コンパイル時のチェックはできません"と同意します。C++では、値をenumに設定することもできますが、 – Alek86

+0

@ Alek86:これで大丈夫ですか。 –

+0

多分あなたは知っていますか? boutいくつかのThirdpartyツール(StyleCopなど)がこれをチェックできますか? – Alek86

関連する問題