Условное присвоение оператора с обнуляемыми<value> типами?

StackOverflow https://stackoverflow.com/questions/75746

Вопрос

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 или любое другое число.Надеюсь, это поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top