3

我创建了一个基本的控制台应用程序来进行这样的测试。

        short val = 32767;

        val++;

        Console.WriteLine(val);

这给了我-32768作为预期结果

        short val = 32767;

        val = val +1;

        Console.WriteLine(val);

但这给了我这个错误

错误 1 ​​*无法将类型“int”隐式转换为“short”。存在显式转换(您是否缺少演员表?)

我很好奇是什么原因造成的?

提前致谢,

4

8 回答 8

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 语言规范的第 7.3.6.2 节,其中列出了二进制数字提升的规则(涵盖 form 的表达式a = b + c;)以及涵盖的 7.6.9前置和后置运算符。

于 2011-06-17T14:06:22.930 回答
2

添加两个shorts 将返回一个int.

+=++运算符的行为不同并且按预期工作。

于 2011-06-17T14:06:54.503 回答
1

在您的情况下,添加两个short 或一个short 和一个int 的结果始终是int 类型,需要将其转换回short 才能分配给val。

之所以如此,是因为两个 short 的总和,或者一个 short 和一个 int 可能不适合 short,所以总是 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
于 2011-06-17T14:06:18.390 回答
0

1您的行中:

val = val +1;

是一个int隐含的,所以结果val + 1是一个int。您正在尝试将该值指定为短,而这不能隐式完成,因为您可能会失去一些精确度。

于 2011-06-17T14:07:18.363 回答
0

使用val + 1使它认为它是一个整数。

使用:

    short val = 32767;

    val = (short) (val + 1);

    Console.WriteLine(val);

应该管用。

于 2011-06-17T14:07:24.677 回答
0

数字的评估默认为 int (Int32)。

在您的情况下,您尝试将 short(Int16) 添加到 int(Int32) 类型。这正确地引发了错误。

于 2011-06-17T14:07:29.893 回答
0
val = val +1;

在这里,1is 的类型int也是如此val + 1

于 2011-06-17T14:07:57.380 回答
0

运行时val++,您只需递增存储在变量中的值。

当您运行时val=val+1,默认情况下1是一个int,因此编译器认为这两个值都是ints,并返回一个int带有该值的值val+1。然后它无法将其放回原处,val因为它int太大而无法存储在短裤中。

于 2011-06-17T14:08:04.740 回答