在C#中编译uint到int的时间转换

我在一段旧代码中得到了这样的枚举:

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

现在, FxCop正在抱怨这个enum使用uint而不是int作为它的支持字段。 (我的任务是尽可能将此代码作为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 } 

但是,我并不认为我可以依赖于此而不是抛出算术exception,或者在读取或写入磁盘时没有正确处理。 我可以依赖这里的位格式匹配enum由unsigned int支持时使用的格式吗?

在这里使用未经检查的关键字,你就可以了; 持久的位模式将是您所期望的。

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

托马斯的答案是100%正确,但我会加上我的三分钱:而不是“修复”已经正确的代码,你总是可以对代码的某些部分施加FxCop规则。

请参阅如何使用SupressMessage抑制FxCop规则’DoNotCatchGeneralExceptionTypes’? 这是使用例子的接受答案。 所有内容都在代码和.csproj中设置,因此当给予最终客户端时,所有这些抑制设置都会保留在代码中。