2011-05-04 90 views
31

我写了下面的小程序,打印出的斐波那契序列:不能类型“诠释”隐式转换为“短”

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

解释将不胜感激。

+0

什么是错误?你为什么用短裤出于兴趣? – 2011-05-04 11:15:42

+4

@汤姆id假设他有评论的行这个行上的问题 – Manatherin 2011-05-04 11:16:28

+0

相关:http://stackoverflow.com/questions/1084668/why-is-the-result-of-a-subtraction-of-an-int16 int16-variable-a – SquidScareMe 2011-05-04 11:19:52

回答

64

微软的Int16变量转换为Int32做附加功能时。

更改如下:

Int16 answer = firstNo + secondNo; 

成...

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

令人困惑的是,为什么它是这样设计的?当两个'Int64'加在一起时(这会导致'Int32'的空间不适合),这会造成问题吗? – 2011-05-04 11:22:57

+0

多个原因,其他答案指向解释* why *的帖子。 – 2011-05-04 11:40:44

2

加号运算符转换操作数为int第一,然后做加法。所以结果是整数。您需要明确地简化它,因为从“较长”类型到“较短”类型的转换明确化,以便您不会在隐式转换时意外丢失数据。

至于为什么INT16被强制转换为int,得到的答案是,因为这是在C# spec定义。而C#就是这样,因为它的设计与CLR的工作方式非常匹配,CLR只有32/64位算术,而不是16位。 CLR上的其他语言可能会选择以不同的方式公开。

4

增加两个Int16值导致Int32值。你将不得不将它转换为Int16

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

您可以通过所有的数字切换到Int32避免这个问题。

1

线

Int16 answer = firstNo + secondNo; 

被解释为

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

只是因为作为Int16的算术没有这样的事情。

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

int是默认的整数类型。短和长仅用于特殊情况。

1

总结2个Int16变量的结果是Int32

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

它输出Int32

+0

OK ............. – Aliostad 2011-05-04 11:22:36

3

的问题是,如果添加两所Int16导致一个Int32正如其他人已经指出。
你的第二个问题,为什么这个问题已不发生在这两个变量的声明在此说明:http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=VS.71%29.aspx

short x = 32767; 

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

所以,它在你的声明中起作用的原因很简单,就是所提供的文字符合short

0

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

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

answer += firstNo; 
answer += secondNo; 
相关问题