I have this very simple example:
class Program { class A { public bool B; } static void Main() { System.Collections.ArrayList list = null; if (list?.Count > 0) { System.Console.WriteLine("Contains elements"); } A a = null; if (a?.B) { System.Console.WriteLine("Is initialized"); } } }
The line if (list?.Count > 0)
compiles perfectly which means that if list
is null
, the expression Count > 0
becomes false
by default.
However, the line if (a?.B)
throws a compiler error saying I can't implicitly convert bool?
to bool
.
Why is one different from the other?
The null coalescing operator is used with the nullable value types and reference types. It is used for converting an operand to the type of another nullable (or not) value type operand, where an implicit conversion is possible.
The null-conditional operators are short-circuiting. That is, if one operation in a chain of conditional member or element access operations returns null , the rest of the chain doesn't execute.
The ?? operator is used to check null values and you can also assign a default value to a variable whose value is null(or nullable type).
In cases where a statement could return null, the null-coalescing operator can be used to ensure a reasonable value gets returned. This code returns the name of an item or the default name if the item is null. As you can see, this operator is a handy tool when working with the null-conditional operator.
list?.Count > 0
: Here you compare an int?
to an int
, yielding a bool
, since lifted comparison operators return a bool
, not a bool?
.a?.B
: Here, you have a bool?
. if
, however, requires a bool
.In your first case (list?.Count
) the operator returns an int?
- a nullable int
.
The >
operator is defined for nullable integers so that if the int?
has no value (is null), the comparison will return false
.
In your second example (a?.B
) a bool?
is returned (because if a
is null, neither true
nor false
but null
is returned). And bool?
cannot be used in an if
statement as the if
statement requires a (non-nullable) bool
.
You can change that statement to:
if (a?.B ?? false)
to make it work again. So the null-coalescing operator (??
) returns false
when the null-conditional operator (?.
) returned null
.
Or (as TheLethalCoder suggested):
if (a?.B == true)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With