无法将类型'int'隐式转换为'short'

时间:2011-05-04 11:13:44

标签: c# int short

我编写了以下小程序来打印出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)?

非常感谢您的解释。

9 个答案:

答案 0 :(得分:74)

Microsoft在执行添加功能时将您的Int16变量转换为Int32

更改以下内容:

Int16 answer = firstNo + secondNo;

...成

Int16 answer = (Int16)(firstNo + secondNo);

答案 1 :(得分:8)

答案 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