如果这句话??= 在 C# 中用于分配 null 那么为什么在此示例中分配值?
IList<string> list = new List<string>() {"cat" , "book" };
(list ??= new List<string>()).Add("test");
foreach (var item in list)
{
Console.WriteLine($"list ??= {item}");
}
如果这句话??= 在 C# 中用于分配 null 那么为什么在此示例中分配值?
IList<string> list = new List<string>() {"cat" , "book" };
(list ??= new List<string>()).Add("test");
foreach (var item in list)
{
Console.WriteLine($"list ??= {item}");
}
你误会了运营商。它不是用于分配空值。相反,它会检查 null,如果检查的变量为 null,它会分配右侧的值。
为了更好地可视化正在发生的事情,写出空合并运算符的简写版本会有所帮助:
(list = list ?? new List<string>()).Add("test");
在上面,它检查列表是否不为空,如果不为空,则将list
变量分配给当前list
变量,最后将“Test”添加到集合中。
由于您的列表已在上面初始化,因此无需分配新列表。
正如Microsoft Docs所说:
空合并赋值运算符 ??= 仅当左侧操作数的计算结果为 null 时,才将其右侧操作数的值分配给其左侧操作数。如果左侧操作数的计算结果为非空,则 ??= 运算符不计算其右侧操作数。
你list
不为空,这就是为什么??=
不分配 new List
。