Из спецификации языка C # (§ 17.3 и 14.16):
17,3 Константы
Константа - это член класса, который
представляет собой постоянное значение: значение
это может быть вычислено во время компиляции.
и
14.16 Постоянные выражения
константное выражение является выражением
это должно быть полностью оценено во время компиляции .
Где выражение
должен быть постоянным, это
указано в грамматике с помощью
константа-выражение.
[...]
Следующие конструкции разрешены в константных выражениях :
- Литералы (включая ноль
Буквальный)
- Ссылки на константные члены классов и структурных типов.
- Ссылки на членов перечислимых типов.
- Заключенные в скобки подвыражения, которые сами являются константными выражениями.
- Приведение выражений при условии, что целевой тип является одним из перечисленных выше типов.
- Предопределенные проверенные и непроверенные, +, -,! И ~ унарные операторы.
- Предопределенные +, -, *, /,%, <<, >>, &, |, ^, &&, ||, ==,! =, <,>, <= И> =
бинарные операторы, при условии, что каждый операнд имеет тип, перечисленный выше.
- ?: Условный оператор.
- размер выражений при условии
неуправляемый тип является одним из типов
указано в §14.5.12.
- значение по умолчанию
выражения, при условии, что тип один
из перечисленных выше типов, или тип
это ссылочный тип или тип
параметр, который известен как
ссылочный тип (§25.7).
следующее
преобразования разрешены в постоянных
выражения:
- Идентификационные преобразования
- Числовые преобразования
- Перечисление преобразований
Другой способ достичь желаемого - использовать статический член только для чтения. Члены только для чтения оцениваются во время выполнения, а не во время компиляции. Поэтому вы можете использовать метод ToString ().
private static readonly EscapeString = EscapeChar.ToString();
Примечание: Поскольку поле только для чтения может быть инициализировано либо в объявлении, либо в конструкторе класса, поля только для чтения могут иметь различных значений в зависимости от используемого конструктора .
Вот хорошая статья о различиях между const и readonly .