Вопрос

Рассмотрим следующие утверждения:

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; }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top