对?的行为感到困惑。算子

BKS*_*BKS 3 .net c# .net-4.6.1

这是我的代码

class Address
{
    public bool IsAppartment { get; set; }
}

class Employee
{
    public string Name { get; set; }
    public Address Address { get; set; }
}    
class Program
{
    static void Main(string[] args)
    {
        Employee employee = new Employee()
        {
            Name = "Charlie"
        };
        if (employee.Address?.IsAppartment ?? true)
        {
            Console.WriteLine("Its an apartment");
        }
        else
        {
            Console.WriteLine("No employee address or not an apartment");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出

它是一个公寓

根据的定义算子

如果条件成员或元素访问操作链中的一个操作返回null,则该链的其余部分将不执行。

在这种情况下,Address对象为null,我不明白为什么它不在代码的else分支中出现?

更新
什么是使用快捷运算符进行跟踪的等效代码?

if (employee.Address != null && employee.Address.IsAppartment == true)
{
    Console.WriteLine("Its an apartment");
}
else
{
    Console.WriteLine("No employee address or not an apartment");
}
Run Code Online (Sandbox Code Playgroud)

Pav*_*ski 9

这是正确的,链的其余部分不执行,空值运算符operator ?? 工作和回报true。每个MSDN

空合并运算符?? 如果不为空,则返回其左操作数的值;否则,它将评估右侧操作数并返回其结果。

如果您想将结果与true或进行比较false(每次更新),则可以使用

if (employee?.Address?.IsAppartment == true)
{
}
Run Code Online (Sandbox Code Playgroud)

左侧操作数返回Nullable<bool>,您也可以在MSND中阅读


Ruf*_*s L 6

更新什么是使用快捷运算符进行跟踪的等效代码?
if (employee.Address != null && ? employee.Address.IsAppartment == true)

if (employee?.Address?.IsAppartment == true)
Run Code Online (Sandbox Code Playgroud)