перечисления всегда инициализируются во время компиляции. Таким образом, им должны быть присвоенные значения, которые могут быть созданы с помощью CTFE (Оценка функции времени компиляции).
неизменяемые переменные могут быть инициализированы во время выполнения. Если неизменяемая переменная имеет глобальное время жизни (так что это переменные модуля, статический класс или статическая локальная переменная), то ее необходимо инициализировать во время компиляции или во время выполнения с помощью статического конструктора (хотя статические локальные переменные не могут назначаться статическим конструктором). Если неизменяемая переменная является нестатической локальной переменной, то она инициализируется во время выполнения (хотя, если значение является константой, компилятор может оптимизировать ее и инициализировать во время компиляции). Таким образом, вы можете создавать неизменяемые локальные переменные во время выполнения, в отличие от перечислений.
РЕДАКТИРОВАТЬ: Еще один случай, который я забыл: неизменяемые переменные-члены должны быть либо инициализированы непосредственно с помощью CTFE, либо инициализированы с помощью неизменяемого конструктора. Если неизменяемая переменная-член инициализируется непосредственно с помощью CTFE, то, очевидно, это делается во время компиляции, тогда как инициализация его в неизменяемом конструкторе выполняется во время выполнения.