Відповіді:
Інші відповіді поки що є правильними; Я просто хотів додати ще один, який трохи чистіший:
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
?