5

古いコードに次のような列挙型があります。

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

現在、FxCopは、バッキングフィールドとしてintではなくuintを使用してこの列挙型について不平を言っています。(そして、このコードをFxCopとして可能な限りクリーンにするという任務を負っています...)しかし、列挙型の上位ビットを使用する既存の列挙型値があり、これはに永続化されているため、変更できません。オンディスクフォーマット。これをコンパイルしようとすると、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
}

ただし、これが算術例外をスローしないこと、またはディスクの読み取りまたは書き込み時に正しく処理されないことを信頼できるとは思いません。ここで、列挙型がunsigned intによってバックアップされたときに使用された形式と一致するビット形式を信頼できますか?

4

2 に答える 2

8

ここでチェックされていないキーワードを使用すると、問題ありません。永続化されたビットパターンは、期待どおりになります。

[Flags]
public enum Example
{
    Foo = 0x00000001,
    Bar = unchecked((int)0xC0000000);
} 
于 2012-08-08T21:57:04.323 に答える
0

トーマスの答えは100%正しいですが、私はそれに3セントを追加します。すでに正しいコードを「修正」する代わりに、コードの一部のFxCopルールをいつでも抑制することができます。

SupressMessageでFxCopルール「DoNotCatchGeneralExceptionTypes」を抑制するにはどうすればよいですか?を参照してください。そしてそれは使用の例として受け入れられた答えです。すべてがコードと.csprojで設定されるため、このような抑制設定はすべて、エンドクライアントに渡されたときにコードに残ります。

于 2012-08-08T22:07:30.730 に答える