50

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

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 分配给变量时)?

一个解释将不胜感激。

4

9 回答 9

96

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

更改以下内容:

Int16 answer = firstNo + secondNo;

进入...

Int16 answer = (Int16)(firstNo + secondNo);
于 2011-05-04T11:16:47.603 回答
8

阅读Eric Lippert对这些问题的回答

于 2011-05-04T11:17:42.730 回答
5

添加两个Int16值会产生一个Int32值。您必须将其转换为Int16

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

您可以通过将所有号码切换为 来避免此问题Int32

于 2011-05-04T11:17:24.710 回答
3

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

short x = 32767;

在前面的声明中,整数文字 32767 隐式地从 int 转换为 short。如果整数文字不适合短存储位置,则会发生编译错误。

因此,它在您的声明中起作用的原因仅仅是提供的文字已知适合short.

于 2011-05-04T11:19:31.677 回答
2

加号运算符首先将操作数转换为 int,然后再进行加法。所以结果是int。您需要将其显式转换回短,因为从“较长”类型到“较短”类型的转换是显式的,这样您就不会因隐式转换意外丢失数据。

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

于 2011-05-04T11:17:11.317 回答
2

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

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

answer += firstNo;
answer += secondNo;
于 2015-10-30T10:25:44.830 回答
1

线

 Int16 answer = firstNo + secondNo;

被解释为

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

仅仅因为没有 Int16 算术之类的东西。

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

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

于 2011-05-04T11:17:26.450 回答
1

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

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

它输出Int32.

于 2011-05-04T11:17:47.850 回答
0

那是因为两个相加的结果Int16是一个Int32. 在此处检查“转换”段落:http: //msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx

于 2011-05-04T11:19:10.210 回答