С# 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);