Ответы:
Все остальные ответы пока верны; Я просто хотел добавить еще один, который немного чище:
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
. Из этого следует, что когда значение для v1
is 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
?