Это не просто обнуляемые; const
могут быть объявлены только типы, встроенные в среду выполнения (из памяти, это bools, различные типы int, float / double и strings).
Почему? Потому что значение встроено непосредственно в сборку во время компиляции, и нет способа встраивать определяемые пользователем типы.
Однако ключевое слово readonly
должно делать то, что вам нужно. В отличие от const
, любые поля readonly
инициализируются во время выполнения, а не во время компиляции, поэтому они могут быть инициализированы с более или менее любым выражением, которое вы хотите.
Редактировать: Как указывает Эрик Липперт, это не так просто. Например, const decimal
работает.
Это:
private const decimal TheAnswer = 42;
... компилирует (ну, Рефлекторы) в это:
[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)]
private static readonly decimal TheAnswer;