иногда компилятор просто недостаточно умен
Проблема, которую вы хотите решить компилятором, эквивалентна проблеме остановки. Поскольку эта проблема доказуемо не решаема компьютерными программами , мы делаем лишь минимальную попытку ее решить. Мы не делаем ничего особенно сложного. Тебе просто придется с этим жить.
Для получения дополнительной информации о том, почему программный анализ эквивалентен проблеме остановки, см. Мою статью на предмет определения того, достижима ли конечная точка метода. По сути, это та же проблема, что и определение того, назначена ли переменная; анализ очень похож.
http://blogs.msdn.com/b/ericlippert/archive/2011/02/24/never-say-never-part-two.aspx
что если бы вам пришлось делать это с ненулевой структурой, у которой не было конструктора по умолчанию?
Такого животного нет. Все структуры, обнуляемые или нет, имеют конструктор по умолчанию.
Можно ли было бы обойти это, если бы start не был простым объектом DateTime?
Выражение default(T)
дает вам значение по умолчанию для любого типа T. Вы всегда можете сказать
Foo f = default(Foo);
и имеют юридическое назначение. Если Foo является типом значения, он вызывает конструктор по умолчанию, который всегда существует. Если это ссылочный тип, то вы получите ноль.