我有一个代码:
static short Sum(short a, short b)
{
return a + b;
}
而且它不能编译,saynig 不能将 'int' 转换为 'short'。我今天可能真的很累,但我看不到问题!
我有一个代码:
static short Sum(short a, short b)
{
return a + b;
}
而且它不能编译,saynig 不能将 'int' 转换为 'short'。我今天可能真的很累,但我看不到问题!
而且它不能编译,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
应该将其定义为 return short
,并且int + int
应该 return long
,这两者都不是真的。
我在某处听说它可能与性能有关,但我不想肯定地说。(也许处理器通常只提供 32 位和 64 位整数的整数运算?)
无论哪种方式,为什么会这样并不重要——这只是语言的规则。
请注意,复合赋值运算符有一个隐式转换回相关类型,因此您可以编写:
short x = 10;
short y = 20;
x += y;
当您将两条短裤相加时,它们的总和可以超过一个短裤的允许值,但对于一个int
. 这几乎就是 Eric Lippert 在他的回答中所说的。
int
旁白:为什么添加两个s 返回 a不是这种情况long
?Eric 也解决了这个问题:
在整数算术环绕的世界中,在 int 中进行所有计算更为明智,这种类型可能具有足够的范围以使典型计算不会溢出。
因此,+
定义添加两个short
s 的运算符返回一个int
。
这就是您收到编译时错误的原因 - 您正在返回int
指定short
返回类型的位置。
short
如果您知道加法将始终导致 a ,则可以将结果显式转换为short
:
static short Sum(short a, short b)
{
return (short)(a + b);
}
Jon Skeet详细解释了为什么您的代码不起作用,但他没有列出您需要做什么才能编译它。您可以使用以下内容:
static short Sum(short a, short b)
{
return (short)(a + b);
}