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

52

我写了下面这个小程序来打印斐波那契数列:

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”转换为“short”。存在显式转换(是否缺少强制转换?)

既然涉及的所有内容都是Int16(短整型),为什么会有任何隐式转换呢?更具体地说,为什么会在此处失败(而不是最初将int分配给变量时)?

希望能够得到解释。


哪一行出现了错误?顺便问一下,你为什么要使用short变量? - Tom Gullen
4
@Tom 我会假定你所指的是这一行代码,因为它有一个注释“Problem on this line”。 - Manatherin
Related:https://dev59.com/questions/jnNA5IYBdhLWcg3wH6AW - SquidScareMe
1
我建议你仅使用int,除非有非常好的理由要使用Int16。 - Jon B
我只是在尝试使用 Int16,以便当 Int16 的宽度无法容纳太大的值时,我可以看到序列重新开始。 - m.edmondson
9个回答

97

当执行加法函数时,Microsoft会将您的Int16变量转换为Int32

请修改以下内容:

Int16 answer = firstNo + secondNo;

进入...

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

为什么设计成这样有点混乱?如果将两个Int64相加(它们不适合Int32的空间),会引起问题吗? - m.edmondson
多种原因,一些其他答案指向解释“为什么”的帖子。 - myermian


6

将两个Int16值相加的结果是一个Int32值。您需要将其转换为Int16:

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

您可以通过将所有数字转换为Int32来避免此问题。


3
问题在于,将两个Int16相加的结果会变成Int32,正如其他人已经指出的那样。
你的第二个问题是,为什么这个问题不会在声明这两个变量时就出现,这里有解释:http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=VS.71%29.aspx
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

3

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

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

它输出 Int32


2

出于某种奇怪的原因,您可以使用 += 运算符来添加 shorts。

short answer = 0;
short firstNo = 1;
short secondNo = 2;

answer += firstNo;
answer += secondNo;

2
加号运算符首先将操作数转换为int,然后进行加法运算。因此结果是int类型。你需要显式地将其强制转换回short类型,因为从“较长”的类型向“较短”的类型转换是显式的,这样就不会在隐式转换中意外丢失数据。
至于为什么int16要被转换为int,答案是因为这是C#规范中定义的。而且C#之所以这样设计,是因为它被设计成与CLR工作方式密切匹配,而CLR只有32/64位算术,没有16位。基于CLR的其他语言可能会选择以不同的方式公开它。

1

这行代码

 Int16 answer = firstNo + secondNo;

被解释为

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

这是因为不存在Int16算术运算。

简单的解决方案:不要使用Int16。使用Int32或者直接使用int

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接