Присвоение условного оператора с Nullable <значение> типы?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

58
задан CodesInChaos 21 April 2012 в 17:46
поделиться

4 ответа

Проблема происходит, потому что условный оператор не смотрит на то, как значение используется (присвоенный в этом случае) для определения типа выражения - просто истинные/ложные значения. В этом случае Вы имеете пустой указатель и Int32, и тип не может быть определен (существуют настоящие причины, которые это не может просто принять Nullable< Int32> ).

, Если Вы действительно хотите использовать его таким образом, необходимо бросить одно из значений к Nullable< Int32> самостоятельно, таким образом, C# может разрешить тип:

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? (int?)null
    : Convert.ToInt32(employeeNumberTextBox.Text),

или

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text),
66
ответ дан Alex Lyman 24 November 2019 в 19:03
поделиться

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

public static class Convert
{
    public static T? To<T>(string value, Converter<string, T> converter) where T: struct
    {
        return string.IsNullOrEmpty(value) ? null : (T?)converter(value);
    }
}

тогда

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);
8
ответ дан NerdFury 24 November 2019 в 19:03
поделиться

В то время как Alex предоставляет корректный и ближайший ответ на Ваш вопрос, я предпочитаю использовать TryParse:

int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
    ? (int?)value
    : null;

Это более безопасно и заботится о случаях недопустимого входа, а также Вашего сценария пустой строки. Иначе, если вводы данных пользователем что-то как 1b им подарят ошибочную страницу с необработанным исключением, вызванным в Convert.ToInt32(string).

6
ответ дан Rory McCrossan 24 November 2019 в 19:03
поделиться

Можно бросить вывод Преобразования:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
   ? null
   : (int?)Convert.ToInt32(employeeNumberTextBox.Text)
3
ответ дан Abe Heidebrecht 24 November 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: