2012-08-08 5 views
5

私はコードの古い作品で、このような列挙型を持っているのではintに:この列挙について今コンパイル時の変換は、C#

[Flags] 
public enum Example: uint 
{  
    Foo = 0x00000001, 
    Bar = 0xC0000000 
} 

FxCop is complainingではなく、それはフィールドをバックアップだとしてint型よりもUINT使用します。 (そして、私はこのコードをFxCopとしてできるだけきれいにすることを任されています...)しかし、enumの高位ビットを使用する既存のenum値があります。これは変更されません。オンディスクフォーマット。私はこれをコンパイルしようとすると、C#コンパイラが正しく文句:

error CS0266: Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) 

をので、私の代わりにこれまでそれを変更するつもりだった。

[Flags] 
public enum Example 
{  
    Foo = 0x00000001, 
    Bar = (int)0xC0000000 
} 

しかし、私は私が依存していることを肯定的ではありませんよこれは算術例外を投げたり、ディスクに読み書きしたりするときに正しく処理されません。列挙型が符号なしのintでサポートされていたときに使用した形式と一致するビット形式に依存できますか?

+0

これは、FxCopのすべての問題を解決するわけではありません。すべての '' Flags''列挙体に '' None''メンバを持たなければならないと言っても驚かないでしょう。これは、コードを変更できない理由についてのコメント付き、インライン警告抑制のための非常に良い場所のようです。 –

+0

@Cody:はい、私はそれをやり遂げる可能性があります。 –

答えて

8

ここで未確認のキーワードを使用すると問題ありません。永続的なビットパターンが期待どおりになります。

[Flags] 
public enum Example 
{ 
    Foo = 0x00000001, 
    Bar = unchecked((int)0xC0000000); 
} 
0

トーマスの答えは、100%正しいですが、私はそれに私の3セントを追加します。代わりに、すでに正しかった「固定」あなたのコードを、あなたは常に、コードの一部のためのFxCopのルールをSUPRESSすることができます。

How do I suppress FxCop rule 'DoNotCatchGeneralExceptionTypes' with SupressMessage?を参照してください。使用例の回答が受け入れられました。すべてがコードと.csprojに設定されているので、そのようなすべての抑制設定は、エンドクライアントに渡されたときにコードにとどまります。

+0

FxCopは悪いアイデアである「正しい」ものを見つけるためにあります。私がすべてを抑圧すれば、それはちょっとポイントを破る。 (私がやっていることは私たちの抑圧を通り抜けて、それを取り除いているので、 "できるだけきれいなFxCopで"クリアするために) –

+1

私の前のコメントはナンセンスでした。私が言っていることは、.Net自体がFxCopの抑制でいっぱいで、あなた自身をチェックするということでした。ほとんどすべてのルールについて、ルールが「一般的に正しい」が実際には不要なケースがあります。私はあなたの下のストレージとの互換性が事実だと思います。もちろん、あなたのenumとアセンブリが "unsigned"を持たない言語で使われていない限り、とにかく、あなたがそれをしなければならない - それを行う:)トーマスの答えは素晴らしいです。私は完全性のために鉱山を追加しました。 – quetzalcoatl

関連する問題