Joh*_*n V 12 c# type-conversion
我有一个代码:
static short Sum(short a, short b)
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
而且它没有编译,saynig无法将'int'转换为'short'.我今天可能真的很累,但我看不出这个问题!
Jon*_*eet 27
而且它没有编译,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)
Run Code Online (Sandbox Code Playgroud)
根据需要提升操作数.
现在,作为原因为什么它的定义是这样-我不知道,说实话.我不买"因为它可能溢出"的论点 - 这表明byte + byte应该被定义为返回short,并且int + int应该返回long,这两者都不是真的.
我听说过它可能与性能有关,但我不想肯定地说.(也许处理器通常只在32位和64位整数上提供整数运算?)
无论哪种方式,它并不真正重要,为什么是这种情况-它的语言只是规则.
请注意,复合赋值运算符具有隐式转换回相关类型,因此您可以编写:
short x = 10;
short y = 20;
x += y;
Run Code Online (Sandbox Code Playgroud)
当你将两个短裤加在一起时,它们可以加起来超过一个短的允许值,但是一个OK的值int.这正是Eric Lippert在他的回答中所说的.
旁白:为什么不添加两个int返回的情况long呢?Eric也解决了这个问题:
在整数运算环绕的世界中,在int中进行所有计算更为明智,这种类型可能具有足够的范围以使典型计算不溢出.
因此,+运营商在添加两个shorts时定义了一个int.
这就是您收到编译时错误的原因 - 您将返回int指定short返回类型的位置.
short如果您知道添加将始终产生以下结果,则可以显式地转换结果short:
static short Sum(short a, short b)
{
return (short)(a + b);
}
Run Code Online (Sandbox Code Playgroud)