简体   繁体   中英

Confused about behavior of ?. operator

Here is my code

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");
        }
    }
}

The output of this program

Its an apartment

According to the definition of ?. operator

if one operation in a chain of conditional member or element access operations returns null, the rest of the chain doesn't execute.

In this case, Address object is null, I don't understand why it's not going in the else branch of the code here?

UPDATE
What will be equivalent code for following using short cut operators?

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

This is correct, the rest of the chain doesn't execute, null-coalescing operator ?? returns true . According to MSDN

The null-coalescing operator ?? returns the value of its left-hand operand if it isn't null; otherwise, it evaluates the right-hand operand and returns its result.

If you want to compare the result with either true or false (per your update) you can use

if (employee?.Address?.IsAppartment == true)
{
}

The left-hand operand returns Nullable<bool> , you can also read about it in MSDN

更新使用快捷操作符进行以下操作的等效代码是什么?
if (employee.Address != null && ? employee.Address.IsAppartment == true)

if (employee?.Address?.IsAppartment == true)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM