关于c#:不能隐式地将类型’int’转换为’short’

Cannot implicitly convert type 'int' to 'short'

本问题已经有最佳答案,请猛点这里访问。

我编写了以下小程序来打印斐波那契序列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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();

}

编译消息是:

Cannot implicitly convert type 'int'
to 'short'. An explicit conversion
exists (are you missing a cast?)

既然所涉及的一切都是一个Int16(简称),那么为什么要进行任何隐式转换呢?更具体地说,为什么这里的失败(而不是最初为变量赋值int时)?

一个解释会很受欢迎的。


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

更改以下内容:

1
Int16 answer = firstNo + secondNo;

进入…

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


阅读埃里克·利珀特对这些问题的回答

  • 整数和蓝色,短+=短问题
  • 一元减号变为一个整型?


添加两个Int16值会得到一个Int32值。你必须把它铸造到Int16上:

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

您可以通过将所有号码切换到Int32来避免这个问题。


问题是,正如其他人已经指出的那样,添加两个Int16会导致一个Int32。您的第二个问题,为什么这两个变量的声明中没有出现这个问题,在这里解释:http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx:

1
short x = 32767;

In the preceding declaration, the integer literal 32767 is implicitly converted from int to short. If the integer literal does not fit into a short storage location, a compilation error will occur.

所以,在您的声明中,它起作用的原因很简单,就是我们知道所提供的文字适合short


加号运算符首先将操作数转换为int,然后进行加法。所以结果是int。您需要显式地将其转换回short,因为从"longer"类型到"shorter"类型A的转换是显式的,这样您就不会意外地使用隐式转换释放数据。

至于为什么int16被强制转换为int,答案是,因为这是C规范中定义的,而C是这样的,因为它被设计成与clr的工作方式紧密匹配,clr只有32/64位算术而不是16位。在clr之上的其他语言可能选择以不同的方式公开这一点。


出于一些奇怪的原因,您可以使用+=运算符添加短裤。

1
2
3
4
5
6
short answer = 0;
short firstNo = 1;
short secondNo = 2;

answer += firstNo;
answer += secondNo;


两个Int16变量相加的结果是一个Int32

1
2
3
4
Int16 i1 = 1;
Int16 i2 = 2;
var result = i1 + i2;
Console.WriteLine(result.GetType().Name);

输出Int32


线

1
 Int16 answer = firstNo + secondNo;

被解释为

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

只是因为没有Int16算术。

简单的解决方案:不要使用int16。使用Int32或简单地使用int

int是默认的整数类型。短和长只在特殊情况下使用。


这是因为添加两个Int16的结果是一个Int32。检查"转换"段落:http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx