我编写了以下小程序来打印出Fibonacci序列:
static void Main(string[] args)
{
Console.Write("Please give a value for n:");
Int16 n = Int16.Parse(Console.ReadLine());
Int16 firstNo = 0;
Int16 secondNo = 1;
Console.WriteLine(firstNo);
Console.WriteLine(secondNo);
for (Int16 i = 0; i < n; i++)
{
//Problem on this line
Int16 answer = firstNo + secondNo;
Console.WriteLine(answer);
firstNo = secondNo;
secondNo = answer;
}
Console.ReadLine();
}
编译信息是:
无法隐式转换类型'int' 太短'。显式转换 存在(你是否错过演员表?)
由于涉及的所有内容都是Int16(简称),那么为什么还有任何隐式转换?更具体地说,为什么在这里失败(而不是最初为变量赋予int)?
非常感谢您的解释。
答案 0 :(得分:74)
Microsoft在执行添加功能时将您的Int16
变量转换为Int32
。
更改以下内容:
Int16 answer = firstNo + secondNo;
...成
Int16 answer = (Int16)(firstNo + secondNo);
答案 1 :(得分:8)
阅读 Eric Lippert 对这些问题的回答
答案 2 :(得分:5)
添加两个Int16
值会产生Int32
值。您必须将其强制转换为Int16
:
Int16 answer = (Int16) (firstNo + secondNo);
您可以将所有号码切换为Int32
来避免此问题。
答案 3 :(得分:3)
问题是,正如其他人已经指出的那样,添加两个Int16
会产生Int32
。
您的第二个问题,为什么在这两个变量的声明中尚未发生此问题的原因在此解释:http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=VS.71%29.aspx:
short x = 32767;
在前面的声明中,整数文字32767被隐式地从int转换为short。如果整数文字不适合短存储位置,则会发生编译错误。
因此,它在你的声明中起作用的原因很简单,就是已知所提供的文字适合short
。
答案 4 :(得分:2)
plus运算符首先将操作数转换为int,然后执行添加操作。所以结果是int。您需要明确地将其强制转换为简短,因为从“较长”类型到“较短”类型的转换是明确的,这样您就不会意外地使用隐式转换来丢失数据。
至于为什么int16被强制转换为int,答案是,因为这是C# spec中定义的内容。而C#就是这种方式,因为它的设计与CLR的工作方式非常匹配,而CLR只有32/64位算术而不是16位。 CLR之上的其他语言可能会选择以不同的方式公开它。
答案 5 :(得分:1)
该行
Int16 answer = firstNo + secondNo;
被解释为
Int16 answer = (Int32) (firstNo + secondNo);
因为没有Int16算术这样的东西。
简单的解决方案:不使用Int16 。使用Int32或简单地int
。
int
是您的默认整数类型。短期和长期仅用于特殊情况。
答案 6 :(得分:1)
对两个Int16
变量求和的结果是Int32
:
Int16 i1 = 1;
Int16 i2 = 2;
var result = i1 + i2;
Console.WriteLine(result.GetType().Name);
输出Int32
。
答案 7 :(得分:1)
由于某些奇怪的原因,您可以使用+ =运算符来添加短路。
short answer = 0;
short firstNo = 1;
short secondNo = 2;
answer += firstNo;
answer += secondNo;
答案 8 :(得分:0)
这是因为添加两个Int16
的结果是Int32
。
点击此处的“转化次数”段落:http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx