我试过
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
哪一点有点,只是添加一个。
这是为什么?还有更好的(阅读更短的方式)?
答案 0 :(得分:8)
与在C#中一样,Nemerle中byte
和byte
之和的结果为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会发生什么?