Почему мое добавление 2 шорт вызывает ошибку компиляции приведения из-за целых чисел? - PullRequest
3 голосов
/ 21 сентября 2011

В моем коде у меня есть следующий код:

Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + 1;

Это дает мне ошибку Cannot implicitly convert type 'int' to 'short'. В качестве ссылки Order и x.Order оба являются шортами, а Max() правильно возвращает short (я это подтвердил). Итак, я понял, он думает, что 1 - это integer и ошибка. Поэтому я изменил его на:

Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + (short)1;

Сейчас я все еще получаю ту же самую компиляцию. Так что, может быть, это не правильно, поэтому я попытался изменить его на

Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + Convert.ToInt16(1);

И все же я все еще получаю ту же ошибку. Наконец-то я получил его на работу, преобразовав все выражение:

Order = Convert.ToInt16(config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + 1);

Почему я не могу разыграть 1 в short и добавить его к другому короткому, не разыгрывая целое?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Это потому, что short + short = int.

Эрик Липперт объясняет это здесь .

Он говорит:

Почему короткий плюс плюс короткий результат в int?

Итак, предположим, что короткая позиция плюс короткая была короткой, и посмотрим, что произойдет:

шорт [] цены = {10000, 15000, 11000}; короткое среднее = (цены [0] + цены [1] + цены [2]) / 3; И в среднем, конечно, -9845, если этот расчет сделан в шортах. Сумма больше самой большой возможно короткое, поэтому оно оборачивается на отрицательное, а затем вы делите отрицательное число.

В мире, где вокруг него гораздо больше целочисленной арифметики разумно делать все вычисления в int, тип, который может иметь достаточный диапазон для типичных расчетов, чтобы не переполнять.

1 голос
/ 21 сентября 2011

В спецификации языка C # (ссылка для скачивания) перечислены предопределенные операторы сложения. Для целочисленных типов это:

int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);

Причина, по которой вы должны разыграть, заключается в том, что нет специального оператора для добавления шортов. Я знаю, что «потому что C # работает так», это не особенно полезный ответ, но вы идете. Я бы просто пошел с:

Order = (short) config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max() + 1;

или

Order = config.DeploymentSteps.Select(x => x.Order).DefaultIfEmpty().Max();
Order++;
1 голос
/ 21 сентября 2011

Как бы это ни звучало избыточно, не могли бы вы объявить короткую переменную (или, возможно, const) и инициализировать ее равной 1 и использовать ее при назначении переменной Order.В отличие от типа int или long, здесь нет буквального способа определения short.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...