В следующем:
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...?
Я ссылаюсь на раздел 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.
нет никакого оператора унарный минус, который принимает короткое значение. Вместо этого резолюция перегрузки выбирает международную версию оператора унарный минус и делает неявное преобразование.