C# Nullable – Why HasValue Property Doesn’t Throw NullReferenceException

.netc++

Consider the following code:

DateTime? ndate = null;
Console.WriteLine(ndate.HasValue);

I would have expected a NullReferenceException, but HasValue will indeed return false. However, since ndate is null, how does the property invocation succeed, since there is no object to invoke the property HasValue on?

Best Answer

Technically, "ndate" is not null - it is a value type, with it's value specified as being null.

When you write DateTime?, this is just shorthand for Nullable<DateTime>, which is a struct. There is no way for this to technically be null, since it's not a reference type.