Как конвертировать C # обнуляемый int в int - PullRequest
427 голосов
/ 13 мая 2011

Как мне преобразовать обнуляемый int в int? Предположим, у меня есть 2 типа int, как показано ниже:

int? v1;  
int v2; 

Я хочу присвоить v1 значение v2. v2 = v1; приведет к ошибке. Как мне конвертировать v1 в v2?

Ответы [ 15 ]

10 голосов
/ 13 июля 2018

Если значение по умолчанию для данного типа является приемлемым результатом:

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() возвращает значение поля без какой-либо проверки.

9 голосов
/ 13 мая 2011

Простое преобразование между 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;
}
9 голосов
/ 13 мая 2011

Вы могли бы сделать

v2 = v1.HasValue ? v1.Value : v2;
6 голосов
/ 21 февраля 2018

В зависимости от контекста использования вы можете использовать функцию сопоставления с образцом в C # 7:

int? v1 = 100;
if (v1 is int v2)
{
    Console.WriteLine($"I'm not nullable anymore: {v2}");
}

EDIT:

Поскольку некоторые люди не голосуют, не оставляя объяснений, я хотел бы добавить некоторые детали, чтобы объяснить обоснование включения этого в качестве жизнеспособного решения.

  • Соответствие шаблону C # 7 теперь позволяет нам проверять тип значения и приводить его неявно. В приведенном выше фрагменте условие if будет проходить только тогда, когда значение, сохраненное в v1, совместимо с типом для типа для v2, который в данном случае равен int. Из этого следует, что когда значение для v1 равно null, условие if не будет выполнено, поскольку нулевое значение не может быть присвоено int. Точнее, null не является int.

  • Я хотел бы подчеркнуть, что это решение не всегда может быть оптимальным выбором. Как я предполагаю, я считаю, что это будет зависеть от точного контекста использования разработчика. Если у вас уже есть int? и вы хотите условно работать с его значением if-and-only-if , назначенное значение не равно нулю (это единственный раз, когда можно безопасно преобразовать обнуляемое int в обычный int без потери информации), тогда сопоставление с образцом, возможно, является одним из наиболее кратких способов сделать это.

2 голосов
/ 11 августа 2017

Ему будет присвоено значение v1 для v2, если оно не равно нулю, в противном случае значение по умолчанию будет равно нулю.

v2=v1??0

Или ниже есть другой способ написать это.

v2 = v1.HasValue?v1:0
...