Попытка преобразовать обнуляемый объект в его базовый тип путем приведения типов обычно приводит к генерированию исключенияSystem. InvalidOperationException,если обнуляемый объект содержит пустое значение. Это может произойти, например, в том случае, если значение обнуляемого объекта присваивается переменной его базового типа с помощью приведения типов. Появления данного исключения можно избежать, если воспользоваться оператором ? ?, называемым
Ниже приведена общая форма оператора ??.
Если
Например, в приведенном ниже фрагменте кода переменнаяbalanceсодержит пустое значение. Вследствие этого переменнойcurrentBalanceприсваивается значение 0 . 0, используемое по умолчанию, и тем самым устраняется причина для генерирования исключения.
double? balance = null; double currentBalance;
currentBalance = balance ?? 0.0;
В следующем фрагменте кода переменнойbalanceприсваивается значение123.75.
double? balance = 123.75; double currentBalance;
currentBalance = balance ?? 0.0;
Теперь переменнаяcurrentBalanceсодержит значение123.75переменнойbalance.
И еще одно замечание: выражение в правой части оператора ? ? вычисляется только в том случае, если выражение в левой его части не содержит значение. Этот факт демонстрируется в приведенной ниже программе.
// Применение оператора ??
using System;
class NullableDemo2 {
// Возвратить нулевой остаток, static double GetZeroBalO {
Console. WriteLine ("В методе GetZeroBalO."); return 0.0;
}
static void Main() {
double? balance = 123.75; double currentBalance;
// Здесь метод GetZeroBalO не вызывается, поскольку // переменная balance содержит конкретное значение. currentBalance = balance ?? GetZeroBalO;
Console.WriteLine(currentBalance);
}
}
В этой программе методGetZeroBal() не вызывается, поскольку переменнаяbalanceсодержит конкретное значение. Как пояснялось выше, если выражение в левой части оператора ? ? содержит конкретное значение, то выражение в правой его части не вычисляется.
Обнуляемые объекты, операторы отношения и логические операторы