我有一个代码:
static short Sum(short a, short b)
{
return a + b;
}
它没有编译,saynig无法转换' int'短暂的'。我今天可能真的很累但我看不出这个问题!
答案 0 :(得分:26)
它没有编译,saynig无法将'int'转换为'short'。我今天可能真的很累但我看不出这个问题!
这就是定义语言的方式。整数类型的+运算符定义为:
static uint op +(uint x, uint y)
static int op +(int x, int y)
static ulong op +(ulong x, ulong y)
static long op +(long x, long y)
根据需要提升操作数。
现在至于原因为什么会这样定义 - 说实话,我不知道。我不买“因为它可能会溢出”的论点 - 这表明应该定义byte + byte
以返回short
,并且int + int
应该返回long
,两者都不是真的。
我听说过它可能与性能有关,但我不想肯定地说。 (也许处理器通常只在32位和64位整数上提供整数运算?)
无论哪种方式,它都不是重要为什么会这样 - 它只是语言的规则。
请注意,复合赋值运算符会隐式转换回相关类型,因此可以写:
short x = 10;
short y = 20;
x += y;
答案 1 :(得分:5)
当您将两个短片一起添加时,它们可以加起来超过允许的短值,但int
的值为OK。这正是Eric Lippert在his answer here中所说的。
除此之外:为什么不添加两个int
返回long
的情况?埃里克也是这样说的:
在整数运算包围的世界中,在int中进行所有计算更为明智,这种类型可能具有足够的范围以便典型计算不会溢出。
因此,添加两个+
时定义的short
运算符会返回int
。
这就是您收到编译时错误的原因 - 您要返回int
,指定short
返回类型`。
如果您知道 总是的结果导致short
short
static short Sum(short a, short b)
{
return (short)(a + b);
}
答案 2 :(得分:1)
Jon Skeet explained in detail为什么你的代码不起作用,但他没有列出你需要做什么才能编译。您可以使用以下内容:
static short Sum(short a, short b)
{
return (short)(a + b);
}