Условное присвоение оператора с обнуляемыми<value> типами?
-
09-06-2019 - |
Вопрос
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: Convert.ToInt32(employeeNumberTextBox.Text),
Я часто ловлю себя на том, что мне хочется делать что-то подобное (EmployeeNumber
является Nullable<int>
поскольку это свойство объекта dbml LINQ-to-SQL, где столбец допускает нулевые значения).К сожалению, компилятор считает, что "Нет неявного преобразования между 'null' и 'int'", хотя оба типа были бы допустимы в операции присваивания нулевому int сами по себе.
Оператор объединения Null не является опцией, насколько я могу видеть, из-за встроенного преобразования, которое должно произойти в .Текстовая строка, если она не равна null.
Насколько я знаю, единственный способ сделать это - использовать оператор if и / или назначить его в два этапа.В данном конкретном случае я нахожу это очень неприятным, потому что я хотел использовать синтаксис инициализатора объекта, и это назначение было бы в блоке инициализации...
Кто-нибудь знает более элегантное решение?
Решение
Проблема возникает из-за того, что условный оператор не рассматривает, как значение используется (присваивается в данном случае) для определения типа выражения - только значения true / false.В этом случае у вас есть ноль и еще Int32, и тип не может быть определен (есть реальные причины, по которым он не может просто предполагать Обнуляемый<Int32>).
Если вы действительно хотите использовать его таким образом, вы должны привести одно из значений к Обнуляемый<Int32> самостоятельно, чтобы C # мог разрешить тип:
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? (int?)null
: Convert.ToInt32(employeeNumberTextBox.Text),
или
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: (int?)Convert.ToInt32(employeeNumberTextBox.Text),
Другие советы
Я думаю, что служебный метод мог бы помочь сделать это чище.
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);
Хотя Алекс дает правильный и приблизительный ответ на ваш вопрос, я предпочитаю использовать TryParse
:
int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
? (int?)value
: null;
Это безопаснее и устраняет случаи недопустимого ввода, а также ваш сценарий с пустой строкой.В противном случае, если пользователь вводит что-то вроде 1b
им будет представлена страница с ошибкой с необработанным исключением, вызванным Convert.ToInt32(string)
.
Вы можете преобразовать выходные данные Convert:
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: (int?)Convert.ToInt32(employeeNumberTextBox.Text)
//Some operation to populate Posid.I am not interested in zero or null
int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response;
var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null;
Редактировать:Краткое объяснение приведенного выше, я пытался получить значение Posid
(если его значение ненулевое int
и имеющий значение больше 0) в переменной X1
.Я должен был использовать (int?)
вкл . Posid.Value
чтобы условный оператор не выдавал никакой ошибки компиляции.Просто К твоему сведению GetHolidayCount
является WCF
метод, который мог бы дать null
или любое другое число.Надеюсь, это поможет