Все остальные ответы пока верны; Я просто хотел добавить еще один, который немного чище:
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 ()», который является нулевым безопасным геттером, который в основном выполняет объединение нулей, как показано выше, так что это тоже работает:
Является ли на default(int)самом деле нужно? Что не так с простым 0?
Коул Джонсон
4
Это будет работать для этого примера, но в общем случае рекомендуется использовать defaultтам, где это необходимо. Ноль не всегда допустим в качестве значения, тем более, по умолчанию, поэтому, если вы замените intего универсальным, Tвы обнаружите, что мой код работает, а ноль - нет. В некоторых будущих версиях фреймворка defaultтакже может стать перегруженным; если и когда это произойдет, код, использующий default, будет легко использовать преимущества, в то время как явные нулевые или нулевые назначения должны быть изменены.
KeithS
5
Это должно подняться до вершины: .NET 4.0, Nullable <T> имеет «GetValueOrDefault ()»
RandomHandle
Спасибо, что вернулись, чтобы отредактировать его с помощью GetValueOrDefault!
CindyH
Вы можете быть осторожны с DateTime при использовании по умолчанию. Это может вставить дату по умолчанию вместо пустой.
Кроме того, если вы не уверены, содержит ли v1 значение null, вы можете использовать оператор объединения нулей, чтобы установить запасное значение. Например, v2 = v1 ?? 0;
Арьен
12
И обязательно проверьте v1.HasValueсначала.
Yuck
3
MSDN говорит, что это будет исключение, если v1есть null. На мой взгляд, это не правильный ответ.
ventiseis
6
@ventiseis Я думаю, что это желательное поведение - я удивлен, что многие другие ответы в порядке с тихим преобразованием нулевого в 0. Если вы присваиваете необнуляемый тип ненулевому типу, вы должны быть уверены, что значение на самом деле не равно нулю. ОП не сказал: «Я хочу назначить v1 для v2 или 0, если v1 равен нулю», но это, как все, казалось, предполагали
Если вы знаете, что 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)метода:
Простое преобразование между 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 isint 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чеков.
Minexew
Я просто не вижу никакого преимущества этого метода перед v1.HasValue в качестве проверки, а затем v1.Value для доступа к базовому значению. Я бы не стал опровергать это, но я думаю, что эта проблема уже решена, и новая методика не добавляет ясности этой проблеме. Я также оценил его на 8-9% медленнее.
Брэндон Баркли
Спасибо за сравнение, это приятно знать! В любом случае, если посмотреть, разница в лучшем случае незначительна (я полагаю, если вы не сделаете это в какой-то критически важной области). Я смотрю на это как на более "сжатое" или, возможно, "идиоматическое", поскольку оно опирается на синтаксические сахара, запеченные в языке вместо API. Это немного субъективно, но, возможно, это «более ремонтопригодно». Хотя на самом деле мне нравится этот подход больше, чем полагаться на значение по умолчанию, как предлагают многие другие ответы.
Николас Миллер
3
Это присвоит значение v1для v2если оно не равно нулю, в противном случае он будет принимать значения по умолчанию , как ноль.
В C # 7.1 и более поздних версиях тип может быть выведен с помощью defaultлитерала вместо defaultоператора, поэтому его можно записать, как показано ниже:
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
При ответе на восьмилетний вопрос с пятнадцатью существующими ответами важно объяснить, каков новый аспект вопроса, к которому относится ваш ответ, и отметить, изменился ли ответ с течением времени. Код только ответы почти всегда можно улучшить, добавив некоторые объяснения.
v1
естьnull
?Ответы:
Все остальные ответы пока верны; Я просто хотел добавить еще один, который немного чище:
Любой
Nullable<T>
является неявно конвертируемым к своемуT
, ПРЕДОСТАВЛЯЯ, что все вычисляемое выражение никогда не может привести к нулевому назначению ValueType. Таким образом, оператор с нулевым слиянием??
является просто синтаксическим сахаром для троичного оператора:... который в свою очередь является синтаксическим сахаром для if / else:
Кроме того, начиная с .NET 4.0,
Nullable<T>
есть метод «GetValueOrDefault ()», который является нулевым безопасным геттером, который в основном выполняет объединение нулей, как показано выше, так что это тоже работает:источник
default(int)
самом деле нужно? Что не так с простым0
?default
там, где это необходимо. Ноль не всегда допустим в качестве значения, тем более, по умолчанию, поэтому, если вы заменитеint
его универсальным,T
вы обнаружите, что мой код работает, а ноль - нет. В некоторых будущих версиях фреймворкаdefault
также может стать перегруженным; если и когда это произойдет, код, использующий default, будет легко использовать преимущества, в то время как явные нулевые или нулевые назначения должны быть изменены.Нравится,
источник
Вы можете использовать свойство Value для назначения.
источник
v1.HasValue
сначала.v1
естьnull
. На мой взгляд, это не правильный ответ.Все, что тебе нужно..
источник
Если вы знаете, что
v1
имеет значение, вы можете использоватьValue
свойство:При использовании
GetValueOrDefault
метода присваивается значение, если оно есть, в противном случае используется значение по умолчанию для типа или заданное вами значение по умолчанию:Вы можете использовать
HasValue
свойство, чтобы проверить,v1
имеет ли значение:Существует также языковая поддержка
GetValueOrDefault(T)
метода:источник
Вы не можете сделать это, если v1 является нулем, но вы можете проверить с оператором.
источник
получает значение объекта. Если это ноль, это возвращает значение по умолчанию int, которое является 0.
Пример:
источник
Если значение по умолчанию для данного типа является приемлемым результатом:
Если вам нужно другое значение по умолчанию, когда результат не определен:
Если вы просто хотите вернуть значение (независимо от того, произошел сбой или нет):
.NET 4.7.2 .:
GetValueOrDefault()
возвращает значение поля без какой-либо проверки.источник
Насколько мне известно, лучшим решением является использование
GetValueOrDefault()
метода.источник
Преобразование Int Nullable в Int может быть сделано так:
источник
это возможно с
v2 = Convert.ToInt32(v1);
источник
Вы могли бы сделать
источник
Простое преобразование между
v1
иv2
невозможно, посколькуv1
имеет большую область значений, чемv2
. Это всеv1
может держать плюсnull
состояние. Для преобразования вам необходимо явно указать, какое значениеint
будет использоваться для отображенияnull
состояния. Самый простой способ сделать это -??
операторЭто также может быть сделано в длинной форме
источник
В зависимости от контекста использования вы можете использовать функцию сопоставления с образцом в C # 7:
РЕДАКТИРОВАТЬ:
Поскольку некоторые люди отказываются от голосования, не оставляя объяснений, я хотел бы добавить некоторые подробности, чтобы объяснить обоснование включения этого в качестве жизнеспособного решения.
Сопоставление с образцом в C # 7 теперь позволяет нам проверять тип значения и приводить его неявно. В приведенном выше фрагменте условие if будет проходить только в том случае, если значение, хранимое в
v1
, совместимо с типом для типа forv2
, которым в данном случае являетсяint
. Из этого следует, что когда значение дляv1
isnull
, условие if не будет выполнено, поскольку null не может быть назначен дляint
. Вернее,null
не являетсяint
.Я хотел бы подчеркнуть, что это решение не всегда может быть оптимальным выбором. Как я предполагаю, я считаю, что это будет зависеть от точного контекста использования разработчика. Если у вас уже есть
int?
и вы хотите условно воздействовать на его значение, если-и-только-если назначенное значение не равно нулю (это единственный раз, когда безопасно преобразовать обнуляемое int в обычное int без потери информации), тогда сопоставление с образцом, пожалуй, один из самых кратких способов сделать это.источник
HasValue
чеков.Это присвоит значение
v1
дляv2
если оно не равно нулю, в противном случае он будет принимать значения по умолчанию , как ноль.Или ниже другой способ написать это.
источник
В C # 7.1 и более поздних версиях тип может быть выведен с помощью
default
литерала вместоdefault
оператора, поэтому его можно записать, как показано ниже:источник
источник