Что такое nullable типы (int?) и как с ними работать в C#?
Увидел запись int? со знаком вопроса. Чем int? отличается от обычного int и как безопасно достать значение?
int? age = null;
2 ответа
Обычные типы-значения (int, bool, DateTime) не могут быть null. Nullable-тип (int?, он же Nullable<int>) добавляет к ним возможность хранить ещё и null — удобно для «значения нет» (например, поле из БД).
int a = null; // ОШИБКА — int не принимает null
int? b = null; // ОК
int? c = 42; // тоже ОК
Как безопасно работать:
int? age = GetAge();
// проверка наличия значения
if (age.HasValue)
Console.WriteLine(age.Value);
// значение по умолчанию, если null
int result = age ?? 0; // 0, если age == null
// или через метод
int result2 = age.GetValueOrDefault(18);
Важно: не читайте .Value без проверки — если внутри null, получите InvalidOperationException. Безопаснее ?? или HasValue. Не путайте int? (nullable value type) с nullable reference types (string? из C# 8) — это похожая идея, но реализована иначе.
Ещё нюанс — арифметика с nullable «заразна»: если хоть один операнд null, результат тоже null.
int? x = 5;
int? y = null;
int? sum = x + y; // null, а не 5!
Console.WriteLine(sum ?? -1); // -1
И сравнения: null > 5 даёт false, поэтому будьте аккуратны с условиями на nullable-числах.