共用方式為


?? 以及 ??= 算符 - 零聚算符

若 非 null,則空聚合運算子??會回傳其左手運算元值。 否則,它會評估右側操作數,並傳回其結果。 當左側操作數的計算結果為非 Null 時,?? 運算符不會計算其右側操作數。 空合併指派運算子 ??= 只有在左側運算元評估為 null 的時候,才會將右側運算元的值指派給左側運算元。 當左側操作數的計算結果為非 Null 時,??= 運算符不會計算其右側操作數。

List<int>? numbers = null;
int? a = null;

Console.WriteLine((numbers is null)); // expected: true
// if numbers is null, initialize it. Then, add 5 to numbers
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5
Console.WriteLine((numbers is null)); // expected: false        


Console.WriteLine((a is null)); // expected: true
Console.WriteLine((a ?? 3)); // expected: 3 since a is still null 
// if a is null then assign 0 to a and add a to the list
numbers.Add(a ??= 0);
Console.WriteLine((a is null)); // expected: false        
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0

運算子 ??= 的左操作數必須是變數、屬性索引器 項目。

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

????= 運算子的左方運算元類型不能是不可為 Null 的實值型別。 特別是,您可以將空合併運算子用於無限制的類型參數。

private static void Display<T>(T a, T backup)
{
    Console.WriteLine(a ?? backup);
}

空合併運算子是右關聯運算子。 也就是說,表單的表達式

a ?? b ?? c
d ??= e ??= f

被評估為

a ?? (b ?? c)
d ??= (e ??= f)

範例

????=運算子在以下情境下非常有用:

  • 在使用 空條件運算 ?. 子 和 ?[]的表達式中,使用運算 ?? 子提供一個替代表達式,以評估帶有空條件運算的表達式結果是否為 null

    double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
    {
        return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
    }
    
    var sum = SumNumbers(null, 0);
    Console.WriteLine(sum);  // output: NaN
    
  • 當你處理 可空值類型 並需要提供底層值型別的值時,請使用運算子 ?? 指定若可空型別值為 null

    int? a = null;
    int b = a ?? -1;
    Console.WriteLine(b);  // output: -1
    

    如果當可空型別值時null,該值應該是底層值型別的預設值,請使用該Nullable<T>.GetValueOrDefault()方法。

  • 為了讓參數檢查程式碼更簡潔,可以使用一個 throw 運算 式作為運算子的 ?? 右手運算元:

    public string Name
    {
        get => name;
        set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null");
    }
    

    上述範例也會示範如何使用 表達式主體成員 來定義屬性。

  • 使用操作 ??= 符替換以下形式的代碼:

    if (variable is null)
    {
        variable = expression;
    }
    

    使用下列程式碼:

    variable ??= expression;
    

運算子多載性

你不能讓 and ??= 操作員過載??

C# 語言規格

如需有關??運算子的更多資訊,請參閱 C# 語言規格中的一節:空聯合運算子

如需運算子 ??= 的詳細資訊,請參閱 C# 語言規格的 複合指派 一節。

另請參閱