Ответы:
Все остальные ответы пока верны; Я просто хотел добавить еще один, который немного чище:
v2 = v1 ?? default(int);
Любой Nullable<T>является неявно конвертируемым к своему T, ПРЕДОСТАВЛЯЯ, что все вычисляемое выражение никогда не может привести к нулевому назначению ValueType. Таким образом, оператор с нулевым слиянием ??является просто синтаксическим сахаром для троичного оператора:
v2 = v1 == null ? default(int) : v1;
... который в свою очередь является синтаксическим сахаром для if / else:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Кроме того, начиная с .NET 4.0, Nullable<T>есть метод «GetValueOrDefault ()», который является нулевым безопасным геттером, который в основном выполняет объединение нулей, как показано выше, так что это тоже работает:
v2 = v1.GetValueOrDefault();
default(int)самом деле нужно? Что не так с простым 0?
defaultтам, где это необходимо. Ноль не всегда допустим в качестве значения, тем более, по умолчанию, поэтому, если вы замените intего универсальным, Tвы обнаружите, что мой код работает, а ноль - нет. В некоторых будущих версиях фреймворка defaultтакже может стать перегруженным; если и когда это произойдет, код, использующий default, будет легко использовать преимущества, в то время как явные нулевые или нулевые назначения должны быть изменены.
Нравится,
if(v1.HasValue)
v2=v1.Value
Вы можете использовать свойство Value для назначения.
v2 = v1.Value;
v1.HasValueсначала.
Если вы знаете, что v1имеет значение, вы можете использовать Valueсвойство:
v2 = v1.Value;
При использовании GetValueOrDefaultметода присваивается значение, если оно есть, в противном случае используется значение по умолчанию для типа или заданное вами значение по умолчанию:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Вы можете использовать HasValueсвойство, чтобы проверить, v1имеет ли значение:
if (v1.HasValue) {
v2 = v1.Value;
}
Существует также языковая поддержка GetValueOrDefault(T)метода:
v2 = v1 ?? -1;
Вы не можете сделать это, если v1 является нулем, но вы можете проверить с оператором.
v2 = v1 ?? 0;
GetValueOrDefault()
получает значение объекта. Если это ноль, это возвращает значение по умолчанию int, которое является 0.
Пример:
v2= v1.GetValueOrDefault();
Если значение по умолчанию для данного типа является приемлемым результатом:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
Если вам нужно другое значение по умолчанию, когда результат не определен:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
Если вы просто хотите вернуть значение (независимо от того, произошел сбой или нет):
v2 = v1.GetValueOrDefault();
.NET 4.7.2 .: GetValueOrDefault()возвращает значение поля без какой-либо проверки.
Насколько мне известно, лучшим решением является использование GetValueOrDefault()метода.
v2 = v1.GetValueOrDefault();
Преобразование Int Nullable в Int может быть сделано так:
v2=(int)v1;
это возможно с v2 = Convert.ToInt32(v1);
Вы могли бы сделать
v2 = v1.HasValue ? v1.Value : v2;
Простое преобразование между v1и v2невозможно, поскольку v1имеет большую область значений, чем v2. Это все v1может держать плюс nullсостояние. Для преобразования вам необходимо явно указать, какое значение intбудет использоваться для отображения nullсостояния. Самый простой способ сделать это - ??оператор
v2 = v1 ?? 0; // maps null of v1 to 0
Это также может быть сделано в длинной форме
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
В зависимости от контекста использования вы можете использовать функцию сопоставления с образцом в C # 7:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Поскольку некоторые люди отказываются от голосования, не оставляя объяснений, я хотел бы добавить некоторые подробности, чтобы объяснить обоснование включения этого в качестве жизнеспособного решения.
Сопоставление с образцом в C # 7 теперь позволяет нам проверять тип значения и приводить его неявно. В приведенном выше фрагменте условие if будет проходить только в том случае, если значение, хранимое в v1, совместимо с типом для типа for v2, которым в данном случае является int. Из этого следует, что когда значение для v1is null, условие if не будет выполнено, поскольку null не может быть назначен для int. Вернее, nullне является int.
Я хотел бы подчеркнуть, что это решение не всегда может быть оптимальным выбором. Как я предполагаю, я считаю, что это будет зависеть от точного контекста использования разработчика. Если у вас уже есть int?и вы хотите условно воздействовать на его значение, если-и-только-если назначенное значение не равно нулю (это единственный раз, когда безопасно преобразовать обнуляемое int в обычное int без потери информации), тогда сопоставление с образцом, пожалуй, один из самых кратких способов сделать это.
HasValueчеков.
В C # 7.1 и более поздних версиях тип может быть выведен с помощью defaultлитерала вместо defaultоператора, поэтому его можно записать, как показано ниже:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1естьnull?