| Операторы ?? и ??= позволяют создавать более понятный и удобочитаемый код. [Оператор ??] Оператор пустого объединения ?? (null-coalescing operator) возвратит значение левого операнда, если оно не null. Иначе будет вычислено и возвращено значение правого операнда ??. Оператор ?? не вычисляет свой правый операнд, если левый операнд не null. 
результат = левыйоперанд ?? правыйоперанд;
 Пример: 
public static void Create (string IniPath = null)
{
   Path = new FileInfo(IniPath ?? EXE + ".ini").FullName.ToString();
}
 Начиная с версии C# 7.3, тип левого операнда оператора ?? должен быть либо ссылочным типом, либо типом, для которого допустимо значние null. Начиная с версии C# 8.0, это требование заменено на другое: тип левого операнда операторов ?? и ??= не может иметь тип, для которого не допускается значение null. В частности, начиная с версии 8.0, можно использовать операторы ?? и ??= для неограниченного типа (т. е. даже шаблона): 
private static void Display< T>(T a, T backup)
{
   Console.WriteLine(a ?? backup);
}
 [Оператор ??=] Оператор присваивания ??= (появился начиная с версии C# 8.0) установит свой левый операнд в значение правого операнда, только если левый операнд вычисляется как null. Оператор?? = не вычисляет правый операнд, если левый операнд имеет значение, отличное от null. 
леваыйоперанд ??= правыйоперанд;
 Пример: 
List< int> списокчисел = null; int? a = null;
   (списокчисел ??= new List< int>()).Add(5);
Console.WriteLine(string.Join(" ", списокчисел));  // выведется: 5
  numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", списокчисел));  // выведется: 5 0
Console.WriteLine(a);                              // выведется: 0
 [Правила использования] Левый операнд оператора ??= должен быть переменной, свойством или индексером. Операторы ?? и ??= имеют правую ассоциативность. Т. е. выражения формы: a ?? b ?? cd ??= e ??= f
 будут вычислены в следующем порядке: a ?? (b ?? c)d ??= (e ??= f)
 Операторы ?? и ??= не могут быть перегружены. Пример 1. В выражениях с null-условными операторами ?. и ?[] можно использовать оператор ??, чтобы предоставить для вычисления альтернативное выражение в случае, когда результат вычисления выражения с null-условными операторами равен null: 
double СуммаЧисел(List< double[]> наборЧисел, int ИндексНабораДляСуммы)
{
    return наборЧисел?[ИндексНабораДляСуммы]?.Sum() ?? double.NaN;
}  var сумма = СуммаЧисел(null, 0);
Console.WriteLine(сумма);  // выведется: NaN
 Пример 2. Когда Вы работаете с типами, для которых допускаются значения null (nullable-тип), и нужно предоставить значение для значения базового типа, используйте оператор ??, чтобы указать значение для случая, когда значение nullable-типа равно null: 
int? a = null; int b = a ?? -1;
   Console.WriteLine(b);      // выведется: -1
 Применяйте метод Nullable< T>.GetValueOrDefault() если значение, используемое для null-значения nullable-типа должно получить значение по умолчанию базового типа. Пример 3. Начиная с версии C# 7.0 можно использовать выражение throw в качестве правого операнда оператора ??, чтобы сделать код проверки аргумента более лаконичным. Здесь также демонстрируется, как использовать элементы, основанные на выражениях, для определения свойства: 
public string Name
{
    get => name;
    set => name = value ??
                  throw new ArgumentNullException(nameof(value),
                  "Имя не может быть null");
}
 Пример 4. Начиная с версии C# 8.0 можно использовать оператор ??= для упрощения кода. Например, следующий блок кода заменяется простым оператором: 
if (variable is null)
{
   variable = expression;
}  // Можно заменить на выражение:
variable ??= expression;
 [Ссылки] 1. ?? and ??= operators (C# reference) site:docs.microsoft.com.2. C#: символы @ и $ перед строкой.
 |