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 (short) であるため、暗黙の変換が行われるのはなぜですか? より具体的には、なぜここで失敗したのですか (変数に最初に int を割り当てたときではありません)?

説明をいただければ幸いです。

4

9 に答える 9

96

Microsoftは、追加機能を実行するときに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

2 つInt16の値を加算すると、1 つの値になりInt32ます。次のようにキャストする必要がありますInt16

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

すべての番号を に切り替えることで、この問題を回避できますInt32

于 2011-05-04T11:17:24.710 に答える
3

問題は、他の人がすでに指摘しているようInt16に、2つの結果を追加することです。 2 番目の質問である、これら 2 つの変数の宣言時にこの問題がまだ発生していない理由については、こちらで説明しています: http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=VS.71%29.aspx :Int32

short x = 32767;

上記の宣言では、整数リテラル 32767 が int から short に暗黙的に変換されます。整数リテラルが短い格納場所に収まらない場合、コンパイル エラーが発生します。

したがって、宣言で機能する理由は、提供されたリテラルがshort.

于 2011-05-04T11:19:31.677 に答える
2

プラス演算子は、最初にオペランドを int に変換してから加算を行います。したがって、結果はintです。「長い」型から「短い」型への変換が明示的に行われるため、暗黙的なキャストで誤ってデータを失うことがないように、明示的に short にキャストし直す必要があります。

int16 が int にキャストされる理由については、これがC# 仕様で定義されているためです。C# がこのようになっているのは、CLR の動作方法に厳密に一致するように設計されており、CLR には 16 ビットではなく 32/64 ビット演算しかないためです。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

Int162 つの変数を合計した結果は次のようになり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は、 2 を加算した結果がInt32. ここで「変換」の段落を確認してください: http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx

于 2011-05-04T11:19:10.210 に答える