我创建了一个基本的控制台应用程序来进行这样的测试。
short val = 32767;
val++;
Console.WriteLine(val);
这给了我 -32768 作为预期结果
short val = 32767;
val = val +1;
Console.WriteLine(val);
但这给了我这个错误
错误1 **无法将类型'int'隐式转换为'short'。存在显式转换(您是否缺少演员?)
我很好奇是什么原因造成的?
提前致谢,
答案 0 :(得分:12)
short + short
操作的结果定义为int
。在第一种情况下,编译器正在继续并对增量的结果应用(short)
强制转换,但它不在第二种情况下。
short myShort = 1;
int resultA = myShort + myShort; // addition returns an integer
short resultB = myShort++; // returns a short, why?
// resultB is essentially doing this
short resultB = (short)(myShort + 1);
除了Joel在评论中提供的链接之外,您还可以参考C# 4.0 language specification的7.3.6.2节,其中列出了二进制数字促销的规则(涵盖{{1}形式的表达式并且还包括7.6.9,它涵盖了前缀和后缀运算符。
答案 1 :(得分:2)
添加两个short
将返回int
。
+=
和++
运营商behave differently并按预期工作。
答案 2 :(得分:1)
在你的情况下,添加两个short或short和int的结果总是int类型,需要转换回short以便分配给val。
之所以如此,那么两个短路的总和,或者短路和一个整数可能都不合适,所以总是int。考虑一下;
short x = 30000;
short y = 30000;
int z = x+y; // would you really want to get a number other than 60000 here?
short s = (short)(x+y); //if you want modulo 2^16
答案 3 :(得分:0)
您队中的1
:
val = val +1;
隐含int
,因此val + 1
的结果为int
。你试图将该值分配为一个简短的值,而这是无法隐式完成的,因为你可能会失去一些精确度。
答案 4 :(得分:0)
使用val + 1
会让它认为它是一个整数。
使用:
short val = 32767;
val = (short) (val + 1);
Console.WriteLine(val);
应该工作。
答案 5 :(得分:0)
数字的评估默认为int(Int32)。
在这种情况下,您尝试将short(Int16)添加到int(Int32)类型。这正确地引发了错误。
答案 6 :(得分:0)
val = val +1;
此处1
的类型为int
,因此val + 1
。
答案 7 :(得分:0)
运行val++
时,只需增加存储在变量中的值。
当您运行val=val+1
时,默认情况下1
为int
,因此编译器会将这两个值视为ints
,并返回值为int
的{{1}} val+1
。然后它无法将其重新放回val
,因为int
很大,可以短暂存储。