Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Confused about behavior of ?. operator

Tags:

c#

.net

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");
}
like image 227
whoami Avatar asked Nov 29 '22 21:11

whoami


2 Answers

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

like image 114
Pavel Anikhouski Avatar answered Dec 08 '22 05:12

Pavel Anikhouski


UPDATE What will be equivalent code for following using short cut operators?
if (employee.Address != null && ? employee.Address.IsAppartment == true)

if (employee?.Address?.IsAppartment == true)
like image 38
Rufus L Avatar answered Dec 08 '22 07:12

Rufus L