5

我在一段旧代码中有一个这样的枚举:

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

现在,FxCop 抱怨这个枚举使用 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
}

但是,我不肯定我可以依靠这个不抛出算术异常,或者在读取或写入磁盘时没有正确处理。我可以依赖这里的位格式匹配枚举由无符号整数支持时使用的格式吗?

4

2 回答 2

8

在这里使用未选中的关键字就可以了;持久的位模式将是您所期望的。

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

Thomas 的回答是 100% 正确的,但我会加三分钱:与其“修复”你已经正确的代码,你总是可以为代码的某些部分禁止 FxCop 规则。

请参阅如何使用 SupressMessage 抑制 FxCop 规则“DoNotCatchGeneralExceptionTypes”?它是使用示例的公认答案。一切都在代码和 .csproj 中设置,因此所有这些抑制设置在提供给最终客户端时都保留在代码中。

于 2012-08-08T22:07:30.730 回答