Відповіді:
Інші відповіді поки що є правильними; Я просто хотів додати ще один, який трохи чистіший:
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він також може перезавантажуватися; якщо і коли це станеться, код, що використовує типовий, легко зможе скористатись, тоді як явні нульові чи нульові призначення повинні бути змінені.
Подобається це,
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()
отримує значення об’єкта. Якщо він є null, він повертає значення за замовчуванням 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 можна зробити так:
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, сумісні з типом типу для v2, яким у цьому випадку є int. Звідси випливає , що , коли значення v1є null, то , якщо умова не вийде, так як нуль не може бути призначений int. Більш правильно, nullце не є int.
Я хотів би зазначити, що це рішення не завжди може бути оптимальним вибором. Як я пропоную, я вважаю, що це залежатиме від точного контексту використання розробника. Якщо ви вже маєте int?і хочете умовно оперувати його значенням, якщо-і-тільки, якщо призначене значення не є нульовим (це єдиний час, коли можна безпечно перетворити нульовий int в звичайний int без втрати інформації), то відповідність шаблону - це, мабуть, один із найбільш стислих способів цього зробити.
HasValueчека.
У C # 7.1 та пізніших версіях можна зробити висновок, використовуючи defaultлітерал замість defaultоператора, щоб його можна було записати, як показано нижче:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1єnull?