c# - 如何在c#中使用多个未选中的

标签 c# unchecked

有没有办法对整个程序或整个 block 使用 unchecked ?

我正在从 java 翻译一些类型为 long 的东西,并且与无符号长常量进行大量比较...有些地方有一些开关有 20~30 个案例...我是否必须单独取消选中每个案例或者有更快/更简单的方法吗?

case 101: 
   return jjMoveStringLiteralDfa5_0(active0, 0x8002010000000000L, active1, 0x1L);

我必须更改为:

   return jjMoveStringLiteralDfa5_0(active0, unchecked((long)0x8002010000000000L), active1, 0x1L);

但是有很多情况......并且它位于具有大量 IF 的解析器生成器中,因此最好有一些东西来抑制整个文件中的这些检查,而不是搜索会生成这些无符号的每个可能的位置长常数...

有一种方法可以在 Visual Studio 选项上进行设置,但由于我正在生成一个解析器,我想知道是否可以使该解析器自动不检查上溢/下溢,这可能吗?

最佳答案

如果您想使用十六进制文字通过二进制补码约定来表达整数,您只需必须提供强制转换和显式使用 unchecked 关键字。示例:

sbyte b = unchecked((sbyte)0xAB);
short s = unchecked((short)0xABCD);
int i = unchecked((int)0xABCDABCD);
long l = unchecked((long)0xABCDABCDABCDABCD);

默认上下文(由 C# 编译器开关和/或 csproj 文件定义)是“未经检查”的上下文是不够的。

如果您可以使用无符号类型(例如uint),则不会遇到此问题。但无符号类型通常不被 BCL 使用,并且不被视为“符合 CLS”。


只要说得完全清楚,使用正数文字,您既不需要强制转换也不需要unchecked关键字:

sbyte b = 0x2E;
short s = 0x2E3F;
int i = 0x2E3F2E3F;
long l = 0x2E3F2E3F2E3F2E3F;

对于常量表达式,存在隐式转换以简化此操作,请参阅 Implicit constant expression conversions .

关于c# - 如何在c#中使用多个未选中的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252881/

相关文章:

java - 修复 Java 中的 "unchecked conversion found"警告?

c# - 将-1转换为uint C#

c# - 单元测试适配器连接数据源失败

c# - xxxxx 是一个命名空间,但像类型一样使用

c# - 直接反/序列化到/从 XML Linq

java - 未经检查的 Actor : Is there a way to avoid it in this case?

scala - Scala 中什么时候需要 @uncheckedVariance?为什么在 GenericTraversableTemplate 中使用它?

c# - 使用 Entity Framework 更新异常?

c# - 从接口(interface)转换为底层类型

jquery - 选中复选框 2 时取消选中复选框 1