This is one of the biggest sources of confusion with VB.Net, IMO.
Nothing in VB.Net is the equivalent of default(T) in C#: the default value for the given type.
- For value types, this is essentially the equivalent of ‘zero’:
0forInteger,FalseforBoolean,DateTime.MinValueforDateTime, … - For reference types, it is the
nullvalue (a reference that refers to, well, nothing).
The statement d Is Nothing is therefore equivalent to d Is DateTime.MinValue, which obviously does not compile.
Solutions: as others have said
- Either use
DateTime?(i.e.Nullable(Of DateTime)). This is my preferred solution. - Or use
d = DateTime.MinValueor equivalentlyd = Nothing
In the context of the original code, you could use:
Dim d As DateTime? = Nothing
Dim boolNotSet As Boolean = d.HasValue
A more comprehensive explanation can be found on Anthony D. Green’s blog