Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中uint到int的编译时转换#_C#_Clr - Fatal编程技术网

C# C语言中uint到int的编译时转换#

C# C语言中uint到int的编译时转换#,c#,clr,C#,Clr,我在一段旧代码中有这样一个枚举: [Flags] public enum Example: uint { Foo = 0x00000001, Bar = 0xC0000000 } 现在,关于使用uint而不是int作为支持字段的枚举。(我的任务是让代码尽可能地FxCop干净…)但是有一个现有的枚举值使用枚举的高阶位,我无法更改它,因为它已被持久化为磁盘格式。当我试图编译它时,C#编译器正确地抱怨: 错误CS0266:无法将类型“uint”隐式转换为“int”。存在显式转

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

[Flags]
public enum Example: uint
{    
    Foo = 0x00000001,
    Bar = 0xC0000000
}
现在,关于使用uint而不是int作为支持字段的枚举。(我的任务是让代码尽可能地FxCop干净…)但是有一个现有的枚举值使用枚举的高阶位,我无法更改它,因为它已被持久化为磁盘格式。当我试图编译它时,C#编译器正确地抱怨:

错误CS0266:无法将类型“uint”隐式转换为“int”。存在显式转换(是否缺少强制转换?)
所以,我打算改成这样:

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

然而,我不能肯定我能依靠它不抛出算术异常,或者在读写磁盘时没有得到正确处理。我能否依赖此处的位格式与枚举由无符号int支持时使用的格式相匹配?

在此处使用未选中的关键字,您就可以了;持久化的位模式将是您所期望的

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

Thomas的答案是100%正确,但我要加上我的三分钱:不必“修复”已经正确的代码,您可以始终对代码的某些部分使用FxCop规则


请参阅并接受使用示例的答案。所有设置都在代码和.csproj中设置,因此,当发送给最终客户机时,所有此类抑制设置都将保留在代码中。

这可能无法解决所有FxCop问题。如果它告诉您所有
[Flags]
枚举都应该有
None
成员,我不会感到惊讶。这似乎是一个很好的抑制内联警告的地方,并附有一条关于为什么不能更改代码的注释。@Cody:是的,我可能会这样做。FxCop是用来找出“正确的”错误想法的。如果我压制一切,那就有点失实了。(说得很清楚,我所做的“尽可能干净”是通过我们的压制并消除它们)我之前的评论是胡说八道。我想说的是,.Net本身充满了FxCop抑制,请自己检查。几乎每一条规则都有这样一种情况,即规则“通常是正确的”,但实际上是不需要的。我认为您与底层存储的兼容性就是这样。当然,除非您的枚举和程序集在没有“未签名”的语言中使用了obe。不管怎样,如果你必须这样做的话,那就去做吧:)托马斯的回答很好。我只是添加了我的完整性。