sometimes the compiler is just not smart enough.
The problem you want to solve by the compiler is equivalent to the stop problem. Since this problem is apparently not solvable by computer programs, we make only a minimal attempt to solve it. We are not doing anything particularly complicated. You just have to live with it.
For more information on why program analysis is equivalent to a stop problem, see my article on whether a method endpoint is available. This is essentially the same problem as determining if a specific variable is defined; the analysis is very similar.
http://blogs.msdn.com/b/ericlippert/archive/2011/02/24/never-say-never-part-two.aspx
What if you needed to do this with a non-null structure that did not have a default constructor?
There is no such animal. All structs, nullable or other, have a default constructor.
Would it be all the same to get around this if the start was not a simple DateTime object?
The expression default(T) gives you the default value for any type T. You can always say
Foo f = default(Foo);
and have a legal purpose. If Foo is a value type, it calls the default constructor, which always exists. If it is a reference type, you get null.
source share