我在一段旧代码中得到了这样的枚举:
[Flags]
public enum Example: uint
{
Foo = 0x00000001,
Bar = 0xC0000000
}
Run Code Online (Sandbox Code Playgroud)
现在,FxCop正在抱怨这个enum使用uint而不是int作为它的支持字段.(并且我的任务是尽可能将此代码作为FxCop清理......)但是现有的枚举值使用枚举的高位,我无法改变它,因为它已被持久化磁盘格式.当我尝试编译它时,C#编译器正确地抱怨:
error CS0266: Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)
所以,我打算将其更改为:
[Flags]
public enum Example
{
Foo = 0x00000001,
Bar = (int)0xC0000000
}
Run Code Online (Sandbox Code Playgroud)
但是,我并不认为我可以依赖于此而不是抛出算术异常,或者在读取或写入磁盘时没有正确处理.我可以依赖这里的位格式匹配枚举由unsigned int支持时使用的格式吗?
在这里使用未经检查的关键字,你就可以了; 持久的位模式将是您所期望的.
[Flags]
public enum Example
{
Foo = 0x00000001,
Bar = unchecked((int)0xC0000000);
}
Run Code Online (Sandbox Code Playgroud)