Подтвердить что ты не робот

Невозможно неявно преобразовать тип 'int' в 'short'

Я написал следующую небольшую программу для печати последовательности Фибоначчи:

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)?

Было бы очень полезно объяснение.

4b9b3361

Ответ 1

Microsoft выполняет преобразование переменных Int16 в Int32 при выполнении функции добавления.

Измените следующее:

Int16 answer = firstNo + secondNo;

в...

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

Ответ 3

Добавление двух значений Int16 приводит к значению Int32. Вам нужно будет отправить его на Int16:

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

Вы можете избежать этой проблемы, переключив все свои номера на Int32.

Ответ 4

Проблема состоит в том, что добавление двух Int16 приводит к Int32, как уже указывали другие.
Ваш второй вопрос, почему эта проблема не возникает при объявлении этих двух переменных, объясняется здесь: http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=VS.71%29.aspx:

short x = 32767;

В предыдущем объявлении целочисленный литерал 32767 неявно преобразован из int в короткий. Если целочисленный литерал не помещается в короткое место хранения, произойдет ошибка компиляции.

Таким образом, причина, по которой он работает в вашей декларации, заключается в том, что предоставленные литералы, как известно, вписываются в short.

Ответ 5

Оператор плюс преобразует операнды в int сначала, а затем добавляет. Поэтому результатом является int. Вам нужно отбросить его на короткий текст, потому что преобразования с более длинного типа на "более короткий" тип делают явным, чтобы вы случайно не потеряли данные с неявным литом.

Что касается того, почему int16 используется для int, ответ есть, потому что это то, что определено в С# spec. И С# - это потому, что он был разработан так, чтобы точно соответствовать тому, как работает CLR, а CLR имеет только арифметику 32/64 бит, а не 16 бит. Другие языки, расположенные поверх CLR, могут выбрать для этого иначе.

Ответ 6

Линия

 Int16 answer = firstNo + secondNo;

интерпретируется как

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

Просто потому, что нет такой вещи, как Int16 арифметика.

Простое решение: Do не использовать Int16. Используйте Int32 или просто int.

int - это ваш целочисленный тип по умолчанию. короткие и длинные используются только в особых случаях.

Ответ 7

Результатом суммирования двух переменных Int16 является Int32:

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

Он выводит Int32.

Ответ 9

По какой-то странной причине вы можете использовать оператор + = для добавления шорт.

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

answer += firstNo;
answer += secondNo;