我有一段代码:
static short Sum(short a, short b)
{
return a + b;
}
它无法编译,说是不能将'int'转换为'short'。 今天或许我真的很累,但我找不出问题!
我有一段代码:
static short Sum(short a, short b)
{
return a + b;
}
它无法编译,说是不能将'int'转换为'short'。 今天或许我真的很累,但我找不出问题!
但它无法编译,提示无法将'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;
在一个整数算术环境下,将所有计算都转换为int更加明智,因为int类型可能具有足够的范围,使得典型的计算不会溢出。
static short Sum(short a, short b)
{
return (short)(a + b);
}
int
值相加得到另一个int
值的论点。 - Jon Skeetint
溢出,但不允许short
。 - OdedJon Skeet已经详细解释了为什么你的代码无法工作,但他没有列出你需要做什么才能使其编译。你可以使用以下方法:
static short Sum(short a, short b)
{
return (short)(a + b);
}
short x
+ short y
超过了 short 类型的最大值,让它抛出一个异常。@user970696 造成溢出异常最简单的方法就是直接使用 throw new OverflowException();
。 - aevitaschecked
或unchecked
块来获得所需的行为,而不是手动检查并抛出异常。 - Servyreturn checked((short)(x + y));
。 - Jeppe Stig Nielsen