如何将1添加到一个字节

时间:2011-07-10 20:58:20

标签: .net nemerle

我试过

 module Program
 {
  Main() : void
  { mutable x : byte = 0B;
    mutable y : byte = 0B;  
    x++;
    //y = x + 1;
    //y = x + 1B;
    //def one:byte=1;//   x = x + one;
  }
 }

无论我尝试哪一个,我都会收到以下错误消息。

  

错误1期望字节,在指定值中得到int:System.Int32不是System.Byte [simple require]的子类型

我发现作品的唯一方法是

    y = ( x + 1 ):>byte

哪一点有点,只是添加一个。

这是为什么?还有更好的(阅读更短的方式)?

4 个答案:

答案 0 :(得分:8)

与在C#中一样,Nemerle中bytebyte之和的结果为int。但是,与C#不同,Nemerle试图尽可能地保持核心语言的紧凑性,将所有语法糖保留在标准宏库中。本着这种精神,+=++运算符是转换为常规加法的宏。

要回答您的问题,(x + 1) :> byte就是这样做的方法。它实际上并非全是坏事,因为它让你的代码的读者知道你知道溢出的危险并承担责任。

但是,如果你对此有强烈的感觉,你可以轻松编写自己的+=++宏来执行演员表。它只需要几行代码。

答案 1 :(得分:2)

免责声明:我不知道Nemerle,但我认为在这方面它的行为类似于C#。

有一种更好更短的方法:不要使用字节。

为什么你首先使用它们?大多数情况下,使用int的计算速度比使用byte更快,因为今天的计算机已针对它们进行了优化。

答案 2 :(得分:2)

这是因为CLR仅为Add IL指令定义了有限数量的有效操作数。有效的是Int32,Int64,Single和Double。也是IntPtr,但往往会被许多语言禁用。

因此,向字节添加常量需要先将字节转换为Int32。添加的结果是Int32。哪个不适合回一个字节。除非你使用更大的锤子。这是健康的,你溢出Byte.MaxValue的几率非常大。

请注意,有些语言会自动转换,VB.NET就是其中之一。但它也会自动生成OverflowException。显然不是你正在使用的那个,也不是C#。这是一个性能选择,溢出测试并不便宜。

答案 3 :(得分:0)

这就是类型系统的功能。添加将值升级为int,然后执行导致int的操作。还有想过如果起始值是255会发生什么?