С# Nullable Types и свойство Value
Я немного неясен, когда/если свойство Value
для типов с нулевым значением должно использоваться при получении значения, содержащегося в типе с нулевым значением. Рассмотрим следующий пример:
int? x = 10;
Console.WriteLine("The value of 'x' is " + x.Value);
Console.WriteLine("The value of 'x' is " + x);
Оба из них возвращают одно и то же значение (10).
Однако, если я изначально установил x
в null
, первый Console.WriteLine
выдает исключение, а второй - нет.
Итак, мой вопрос в этом. В чем смысл использования свойства Value
? Кажется, что это не требуется для получения фактического значения (даже если оно null
) и генерирует исключение, если значение действительно null
.
Ответы
Ответ 1
Это обычно необходимо - просто не в вашем конкретном случае. Тип x
равен Nullable<int>
, а не int
- и нет никакого неявного преобразования от Nullable<T>
до T
.
Посмотрим, что происходит в вашем примере. Ваша заключительная строка преобразуется в:
Console.WriteLine(string.Concat("The value of 'x' is ", x));
Этот бокс x
, который приведет к коробке int
или нулевой ссылке... оба из которых обрабатываются string.Concat
.
Если вы не конвертируете в строку с помощью конкатенации строк, например. если вы хотите:
int nonNullable = x.Value;
тогда вам нужно использовать свойство Value
- или явный приведение в действие или, возможно, нулевой оператор коалесценции, или вызов GetValueOrDefault
:
int nonNullable = (int) x;
int alternative = x ?? 20;
int andAnother = x.GetValueOrDefault(20);
Ответ 2
x
и x.Value
имеют разные типы.
static void Meth(int i)
{
int? x = 5;
Meth(x);
Meth(x.Value);
}
Вторая строка не компилируется.
Таким образом, причина использования x.Value
очевидна - вам нужно позвонить, когда вам нужно фактическое значение. И NullReferenceException
разумно, потому что null
не соответствует значению типа значения.
Ответ 3
Вам нужно получить доступ к свойству Value, если свойство HasValue возвращает true, иначе вы получите исключение.
Ваш пример работает, потому что Nullable перегружает метод ToString(), а компилятор С# поддерживает ярлыки для этого типа.
Ответ 4
когда x
имеет значение null x.Value
выдаст исключение (независимо от типа x)
string + null = string
: исключение
Ответ 5
Если вы хотите использовать .value для nullable int. вы можете проверить значение, подобное этому
int? x = null;
int valXX = x.HasValue ? x.Value : 0;
Console.WriteLine("The value of 'x' is " + valXX);
Console.WriteLine("The value of 'x' is " + valXX);