Ответ 1
Microsoft выполняет преобразование переменных Int16
в Int32
при выполнении функции добавления.
Измените следующее:
Int16 answer = firstNo + secondNo;
в...
Int16 answer = (Int16)(firstNo + secondNo);
Я написал следующую небольшую программу для печати последовательности Фибоначчи:
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)?
Было бы очень полезно объяснение.
Microsoft выполняет преобразование переменных Int16
в Int32
при выполнении функции добавления.
Измените следующее:
Int16 answer = firstNo + secondNo;
в...
Int16 answer = (Int16)(firstNo + secondNo);
Прочитайте ответы Эрика Липперта на эти вопросы
Добавление двух значений Int16
приводит к значению Int32
. Вам нужно будет отправить его на Int16
:
Int16 answer = (Int16) (firstNo + secondNo);
Вы можете избежать этой проблемы, переключив все свои номера на Int32
.
Проблема состоит в том, что добавление двух Int16
приводит к Int32
, как уже указывали другие.
Ваш второй вопрос, почему эта проблема не возникает при объявлении этих двух переменных, объясняется здесь: http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=VS.71%29.aspx:
short x = 32767;
В предыдущем объявлении целочисленный литерал 32767 неявно преобразован из int в короткий. Если целочисленный литерал не помещается в короткое место хранения, произойдет ошибка компиляции.
Таким образом, причина, по которой он работает в вашей декларации, заключается в том, что предоставленные литералы, как известно, вписываются в short
.
Оператор плюс преобразует операнды в int сначала, а затем добавляет. Поэтому результатом является int. Вам нужно отбросить его на короткий текст, потому что преобразования с более длинного типа на "более короткий" тип делают явным, чтобы вы случайно не потеряли данные с неявным литом.
Что касается того, почему int16 используется для int, ответ есть, потому что это то, что определено в С# spec. И С# - это потому, что он был разработан так, чтобы точно соответствовать тому, как работает CLR, а CLR имеет только арифметику 32/64 бит, а не 16 бит. Другие языки, расположенные поверх CLR, могут выбрать для этого иначе.
Линия
Int16 answer = firstNo + secondNo;
интерпретируется как
Int16 answer = (Int32) (firstNo + secondNo);
Просто потому, что нет такой вещи, как Int16 арифметика.
Простое решение: Do не использовать Int16. Используйте Int32 или просто int
.
int
- это ваш целочисленный тип по умолчанию. короткие и длинные используются только в особых случаях.
Результатом суммирования двух переменных Int16
является Int32
:
Int16 i1 = 1;
Int16 i2 = 2;
var result = i1 + i2;
Console.WriteLine(result.GetType().Name);
Он выводит Int32
.
Это потому, что результатом добавления двух Int16
является Int32
.
Проверьте здесь пункт "конверсии": http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx
По какой-то странной причине вы можете использовать оператор + = для добавления шорт.
short answer = 0;
short firstNo = 1;
short secondNo = 2;
answer += firstNo;
answer += secondNo;