Ответ 1
В вашем коде используется то, что называется тип с нулевым значением. Перечисление, подобно int или DateTime, является так называемым "типом значения", который всегда должен иметь некоторое значение. Необязательные типы позволяют обрабатывать типы значений, как если бы они допускали нулевые значения.
Например, этот код является недопустимым и не будет компилироваться, потому что перечисления не могут иметь значение null:
E_Week week = null;
Но этот код действителен:
E_Week? week = null;
И это точно так же, как это:
Nullable<E_Week> week = null;