Унарный минус на коротком становится интервалом?

В следующем:

public class p
{
  short? mID;
  short? dID;
}

short id = p.mID ?? -p.dID.Value;

Компилятор дает мне ошибку:

Ошибка 21 не Может неявно преобразовать тип 'интервал' в 'короткий'. Явное преобразование существует (Вы скучаете по броску?)

Я должен изменить код на следующее для него для работы:

short id = p.mID ?? (short)-p.dID.Value;

Именно, как будто компилятор делает что-то как (интервал) 0 - p.dID.Value, или Int16.operator - возвращает Int32s...?

8
задан rabidpebble 13 January 2010 в 16:08
поделиться

2 ответа

Я ссылаюсь на раздел 7.6.2 спецификации, в котором говорится:


для работы формы -x, разрешение по перегрузке оператора Unary применяется для выбора конкретной реализации оператора. Операнд преобразуется в тип параметра выбранного оператора, а тип результата является возвращаемый тип оператора. Предопределенные операторы отрицания:

целочисленные отрицания:

int operator –(int x);
long operator –(long x);

Результат вычисляется вычитанием х от нуля. Если значение X - наименьшее представимое значение типа операнда (-2 ^ 31 для int или -2 ^ 63 в течение длительного времени), то математическое отрицание X не представило в типе операнда. Если это происходит в рамках проверенного контекста, выдается система. Если это произойдет в неконкуренном контексте, результатом является значение операнда, а переполнение не сообщается. Если операнда оператора отрицания имеет тип UINT, он преобразуется в тип длиной, а тип результата длинный. Исключение является правило, которое позволяет получать значение INT -2147483648 (-2 ^ 31), чтобы написать как десятичное целочисленное литерал.

Если операнд оператора отрицания имеет тип ueong, возникает ошибка времени компиляции. Исключение - это правило, которое разрешает длительное значение -9223372036854775808 (-2 ^ 63), чтобы быть написанным как десятичный целочисленный литерал.

Отрицание с плавающей точкой:

float operator –(float x);
double operator –(double x);

Результатом является значение x с его инвертированным знаком. Если X NAN, результат также нан.

Десятичная отрицание:

decimal operator –(decimal x);

Результат вычисляется вычитанием х от нуля. Десятичная отрицание эквивалентна использовать unary minus оператора типа системы.


Как вы можете видеть, не существует Оператор «Унарный минус», определенный на шортах; Разрешение перегрузки выбирает One On Int Mint, потому что один является лучшим совпадением всех доступных операторов NANY Minus.

14
ответ дан 5 December 2019 в 10:41
поделиться

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

2
ответ дан 5 December 2019 в 10:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: