System.nullable Каково значение null * int value?
-
19-09-2019 - |
Вопрос
Рассмотрим следующие утверждения:
int? v1 = null;
int? v2 = 5 * v1;
Какова ценность v2
? (null
или пустая строка?)
Как я могу помешать компилятору пометить его как недействительную работу? Нужно ли следовать обращению с исключительными исключениями?
Решение
Это null
.
Спецификация языка C# 3.0 (раздел §7.2.7: поднятые операторы)
Для бинарных операторов
+
-
*
/
%
&
|
^
<<
>>
:Поднятая форма оператора существует, если операнд и типы результатов-все это не ненулируемые типы значений. Поднятая форма построена путем добавления одного
?
модификатор для каждого операнда и типа результата. Поднятый оператор производитnull
значение, если один или оба операндаnull
(Исключением является&
а также|
операторыbool?
Тип, как описано в §7.10.3). В противном случае поднятый оператор разворачивает операнды, применяет базовый оператор и завершает результат.
Как я могу помешать компилятору пометить его как недействительную работу? Нужно ли следовать обращению с исключительными исключениями?
Это не недействительная операция. Это не вызовет исключение, поэтому вам не нужно справляться с исключениями в этом случае.
Другие советы
Если вы хотите, чтобы операция была предотвращена компилятором, сделайте вторую переменную не нулевую. Тогда вы будете вынуждены написать:
int v2 = 5 * v1.Value;
Это сделает исключение во время выполнения, если v1 будет нулевым.
Его значение будет «нулевым», в этом контексте, по крайней мере, можно считать таким же, как база данных NULL, то есть, а не ничего, или нулевое, это означает «неизвестный». Пять партий неизвестны, он также никогда не будет «пустой строкой», поскольку вы имеете дело с числами, а не строками.
Я не уверен, что вы имеете в виду под "как я могу помешать компилятору пометить его как недействительную операцию?" Поскольку этот код компилирует и работает нормально для меня под Visual Studio 2008 =)
Я не уверен, что вы пытаетесь сделать, но если вы хотите, чтобы v2 был нулевым, если v1 null, вам следует проверить, имеет ли v1 значение перед его использованием.
int? v2 = v1.HasValue ? 5 * v1.Value : null;
или же
int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }