用C#编程:
short a, b;
a = 10;
b = 10;
a = a + b; // Error : Cannot implicitly convert type 'int' to 'short'.
// we can also write this code by using Arithmetic Assignment Operator as given below
a += b; // But this is running successfully, why?
Console.Write(a);
答案 0 :(得分:71)
这里有两个问题。第一个是“为什么短期加上短期结果在int?”
好吧,假设短期和空头很短,看看会发生什么:
short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;
如果这个计算是短暂的,那么平均值当然是-9845。总和大于最大可能的短,所以它回绕到负数,然后你除去负数。
在整数运算包围的世界中,在int中进行所有计算更为明智,这种类型可能具有足够的范围以便典型计算不会溢出。
第二个问题是:
这个问题有一个错误的前提;上面的第三行是错误的。 C#规范见7.17.2节
否则,如果选择的运算符是 一个预定义的运算符,如果返回 所选运算符的类型是 明确可转换为类型 x,如果y是可隐式转换的 到x的类型或运算符是 换班操作员,那么操作就是 评估为x =(T)(x op y),其中T 是x的类型,除了x是 只评估一次。
编译器代表您插入强制转换。正确的推理是:
如果它没有为您插入演员表,则无法在许多类型上使用复合赋值。
答案 1 :(得分:12)
好吧,+=
运算符表示您将使用short增加a
的值,而=
表示您将覆盖值,与操作的结果。操作a + b
产生一个int,不知道它可以做什么,并且你试图将该int分配给short。
答案 2 :(得分:9)
你必须使用:
a = (short)(a + b);
关于赋值和添加赋值行为之间的区别,我想它与此有关(来自msdn)
x+=y
is equivalent to
x = x + y
except that x is only evaluated once. The meaning of the + operator is
dependent on the types of x and y (addition for numeric operands,
concatenation for string operands, and so forth).
但是,它有点模糊,所以具有更深刻理解力的人可以发表评论。
答案 3 :(得分:7)
这是因为int是定义+
的最小签名类型。任何较小的东西首先被提升为int。 +=
运算符是根据+
定义的,但是使用特殊情况规则来处理不符合目标的结果。
答案 4 :(得分:1)
这是因为+ =是作为重载函数实现的(其中一个是short,编译器选择最具体的重载)。对于表达式(a + b),编译器在分配之前默认将结果扩展为int。