Introduced in C# 6.0, the Null Conditional Operator ?. will immediately return null if the expression on its left-hand side evaluates to null , instead of throwing a NullReferenceException . If its left-hand side evaluates to a non- null value, it is treated just like a normal . operator.
If you think of it from a programming (i.e. pointer reference) point of view then, yes, two references of null have the same pointer value and, since most of the popular languages will fall back to pointer-equality if no custom equality is defined, null does equal null.
null (C# Reference)The null keyword is a literal that represents a null reference, one that does not refer to any object. null is the default value of reference-type variables. Ordinary value types cannot be null, except for nullable value types.
The C# language has the is keyword which allows you to check if a variable is of a given type. This is commonly helpful when dealing with a variable of type object , checking if a type extends a base class, checking if a type implements an interface or when dealing with generics.
This question was the subject of my blog on May 30th 2013. Thanks for the great question!
You're staring at an empty driveway.
Someone asks you "can your driveway hold a Honda Civic?"
Yes. Yes it can.
Someone points you at a second driveway. It is also empty. They ask "Can the current contents of my driveway fit in your driveway?"
Yes, obviously. Both driveways are empty! So clearly the contents of one can fit in the other, because there are no contents of either in the first place.
Someone asks you "Does your driveway contain a Honda Civic?"
No, it does not.
You're thinking that the is
operator answers the second question: given this value, does it fit in a variable of that type? Does a null reference fit into a variable of this type? Yes it does.
That is not the question that the is
operator answers. The question that the is
operator answers is the third question. y is X
does not ask "is y
a legal value of a variable of type X
?" It asks "Is y
a valid reference to an object of type X
?" Since a null reference is not a valid reference to any object of any type, the answer is "no". That driveway is empty; it doesn't contain a Honda Civic.
Another way to look at it is that y is X
answers the question "if I said y as X
, would I get a non-null result? If y is null, clearly the answer is no!
To look a little deeper at your question:
One expects that the null value belongs to any reference (or nullable) type
One would be implicitly assuming that a type is a set of values, and that assignment compatibility of a value y with a variable of type X is nothing more nor less than checking whether y is a member of set x.
Though that is an extremely common way of looking at types, that is not the only way of looking at types, and it is not the way that C# looks at types. Null references are members of no type in C#; assignment compatibility is not merely checking a set to see if it contains a value. Just because a null reference is assignment compatible with a variable of reference type X does not mean that null is a member of type X. The "is assignment compatible with" relation and the "is a member of type" relation obviously have a lot of overlap, but they are not identical in the CLR.
If musings about type theory interest you, check out my recent articles on the subject:
What is this thing you call a "type"? Part one
What is this thing you call a "type"? Part Two
I think null is string
returning false is very intuitive. Null means nothing, and it is definitely not a string. So it should return false. While it is a choice the language designers made, it is a very intuitive one when you consider the real world meaning of null.
The null
literal can be assigned to any reference type. It is not a type in an of itself. It is a special literal that represents a null reference.
In the case that is
would return true
when a null
would be passed in, what would you be able to do with the null
literal? Nothing - it is null
. What would be the point of it returning true
except for confusing matters?
Regardless - in terms of how intuitive that is, read the code in English and tell me:
null is string;
When I see that, it seems to be asking the question is "nothing" a string?
. My intuition tells me that no, it isn't - it's nothing
.
http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.71%29.aspx
An is expression evaluates to true if both of the following conditions are met:
- expression is not null.
- expression can be cast to type. That is, a cast expression of the form (type (expression) will complete without throwing an exception. For more information, see 7.6.6 Cast expressions.
As a practical matter, having "null is T == false" saves me typing extra code:
Instead of having to say
if (X != null && X is Foo) {}
I can just say
if (X is Foo) {}
and be done with it.
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