【问题标题】:Cannot implicitly convert type 'int' to 'short' [duplicate]无法将类型“int”隐式转换为“short”[重复]
【发布时间】:2011-08-18 10:59:03
【问题描述】:

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

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

非常感谢您的解释。

【问题讨论】:

  • 哪一行出错了?为什么你出于兴趣使用短裤?
  • @Tom id 假设他在这一行有评论问题所在的行
  • 我建议你直接使用 int 来代替,除非有很好的理由使用 Int16
  • 我只是在使用Int16 进行实验,所以我可以看到序列再次开始(当Int16 的宽度不能再容纳太大的值时)

标签: c# int short


【解决方案1】:

在执行 add 函数时,Microsoft 会将您的 Int16 变量转换为 Int32

更改以下内容:

Int16 answer = firstNo + secondNo;

进入...

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

【讨论】:

  • 令人困惑,为什么要这样设计?将两个Int64 加在一起时是否会导致问题(它们不适合Int32 的空间)?
  • 多种原因,其他一些答案指向解释为什么的帖子。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      线

       Int16 answer = firstNo + secondNo;
      

      被解释为

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

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

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

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

      【讨论】:

        【解决方案5】:

        【讨论】:

          【解决方案6】:

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

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

          它输出Int32

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              short x = 32767;
              

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

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  猜你喜欢
                  • 2012-11-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-12-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多