我在一段旧代码中得到了这样的枚举:
[Flags]
public enum Example: uint
{
Foo = 0x00000001,
Bar = 0xC0000000
}
现在,关于此枚举的FxCop is complaining使用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
}
但是,我不能肯定我可以依赖于此而不是抛出算术异常,或者在读取或写入磁盘时没有正确处理。我可以依赖这里的位格式匹配枚举由unsigned int支持时使用的格式吗?
答案 0 :(得分:8)
在这里使用未经检查的关键字,您就可以了;持久的位模式将是你所期望的。
[Flags]
public enum Example
{
Foo = 0x00000001,
Bar = unchecked((int)0xC0000000);
}
答案 1 :(得分:0)
托马斯的答案是100%正确,但我会加上我的三分钱:而不是“修复”已经正确的代码,你总是可以对代码的某些部分施加FxCop规则。
请参阅How do I suppress FxCop rule 'DoNotCatchGeneralExceptionTypes' with SupressMessage?,并将其作为使用示例的接受答案。所有内容都在代码和.csproj中设置,因此所有这些抑制设置都会在提供给最终客户端时保留代码。