System.Nullable <T>Какое значение имеет значение null * int? - PullRequest
4 голосов
/ 25 августа 2009

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

int? v1 = null;

int? v2 = 5 * v1;

Какое значение v2? (null или пустая строка?)

Как запретить компилятору пометить его как недопустимую операцию? Нужно ли следовать пользовательской обработке исключений?

Ответы [ 4 ]

19 голосов
/ 25 августа 2009

Это null.

Спецификация языка C # 3.0 (раздел §7.2.7: Поднятые операторы)

Для бинарных операторов + - * / % & | ^ << >>:

существует поднятая форма оператора, если все типы операндов и результатов являются необнуляемыми типами значений. Поднятая форма создается путем добавления одного модификатора ? к каждому операнду и типу результата. Поднятый оператор создает значение null, если один или оба операнда имеют значение null (исключение составляют операторы & и | типа bool?, как описано в §7.10. 3). В противном случае поднятый оператор разворачивает операнды, применяет базовый оператор и переносит результат.


Как я могу запретить компилятору пометить его как недопустимую операцию? Нужно ли следовать пользовательской обработке исключений?

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

11 голосов
/ 25 августа 2009

Если вы хотите, чтобы операция была предотвращена компилятором, сделайте вторую переменную ненулевой. Тогда вам придется написать:

int v2 = 5 * v1.Value;

Это вызовет исключение во время выполнения, если v1 равно нулю.

1 голос
/ 25 августа 2009

Я не уверен, что вы пытаетесь сделать, но если вы хотите, чтобы v2 был нулевым, если v1 нулевым, то вам следует проверить, имеет ли v1 значение, прежде чем его использовать.

int? v2 = v1.HasValue ? 5 * v1.Value : null;

или

int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
1 голос
/ 25 августа 2009

Его значение будет равно «нулю», в этом контексте, по крайней мере, его можно считать равным нулю базы данных, т. Е. Вместо «Ничего» или «Ноль», это означает «Неизвестно». Пять лотов Unknown еще неизвестны, они также никогда не будут «пустой строкой», так как вы имеете дело с числами, а не со строками.

Я не уверен, что вы подразумеваете под "Как я могу запретить компилятору пометить его как недопустимую операцию?" так как этот код компилируется и работает нормально для меня в Visual Studio 2008 =)

...