编译时 在 C# 中将 uint 转换为 int



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

[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
}

但是,我并不肯定我可以依靠它不抛出算术异常,或者在读取或写入磁盘时未正确处理。我可以依赖此处的位格式与枚举由无符号 int 支持时使用的格式匹配吗?

在这里使用未选中的关键字,你会没问题;持久位模式将是你所期望的。

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

Thomas 的答案是 100% 正确的,但我会加上我的三分钱:与其"修复"已经正确的代码,不如始终为代码的某些部分压制 FxCop 规则。

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

最新更新