当您尝试在C#.NET中声明一个超出其值范围的值的无符号变量时,它将被标记为编译器错误,但如果您在运行时生成负值并在运行时将其分配给该变量,则值将换行.
uint z = -1; // Will not compile uint a = 5; uint b = 6; uint c = a - b; // Will result in uint.MaxValue
有没有一个很好的理由为什么无符号变量在这种情况下包装而不是抛出异常?
谢谢.
在C#中声明未分配的变量不会标记错误 - 尝试为变量分配无效值.例如,这是一个在声明后未明确赋值的变量(假设它是本地的):
uint z;
-1不是uint的有效值,不超过0.5,这就是为什么你的例子不能编译的原因.
现在,至于其余部分:整数类型只是在溢出时换行 - 就像为int.MaxValue
返回添加1一样int.MinValue
.与使程序检查每个溢出操作相比,这是一个显着的性能改进 - 代价是可能没有发现错误.
只有当你处于未经检查的环境中时才会这样 - 请注意 - 如果您在检查的上下文中执行任何这些操作,您将获得异常.例如;
class Test { static void Main() { checked { uint a = 5; uint b = 6; uint c = a - b; } } }
运行它,你会看到一个OverflowException
抛出.如果这是你想要的整个项目,你可以在项目属性中设置它(或使用/checked+
命令行选项编译csc
).
编辑:值得注意的是,其他答案表明您可以在检查的上下文中放入少量代码 - 只需要声明和分配,c
甚至只是计算.这一切都非常灵活.
包装是因为dfault C#未经检查.如果添加"已选中"块,将检测到溢出:
uint a = 3, b = 4; checked { uint c = a - b; // throws an overflow }
至于编译器:它只需要有效的数据.