2011-05-04 49 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; 
相關問題