空合併運算子 ??
會返回其左側運算元的值,如果不是 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
運算子 ??=
的左操作數必須是變數、屬性或 索引器 項目。
??
和 ??=
運算子的左方運算元類型不能是不可為 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 條件運算符
?.
和?[]
的運算式中,您可以使用??
運算元來提供替代運算式,以便在運算式結果是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 的實值型 別,且需要提供基礎實值型別的值時,請使用
??
運算符來指定提供的值,以防可為 Null 的型別值為null
:int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
使用Nullable<T>.GetValueOrDefault()方法,如果可為 Null 的型別
null
值應該是基礎型別的預設值。您可以使用
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;
運算子多載性
運算子 ??
和 ??=
無法多載。
C# 語言規格
如需有關??
運算子的更多資訊,請參閱 C# 語言規格中的一節:空聯合運算子。
如需運算子 ??=
的詳細資訊,請參閱 功能提案附註。