Могу ли я инициализировать константную строку из константного символа в C #? - PullRequest
7 голосов
/ 04 января 2009

Я так или иначе пытаюсь сделать следующее:

const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)

Это не компилируется. Есть ли другой способ заставить его работать?

Ответы [ 4 ]

8 голосов
/ 04 января 2009

Из спецификации языка C # (§ 17.3 и 14.16):

17,3 Константы

Константа - это член класса, который представляет собой постоянное значение: значение это может быть вычислено во время компиляции.

и

14.16 Постоянные выражения

константное выражение является выражением это должно быть полностью оценено во время компиляции . Где выражение должен быть постоянным, это указано в грамматике с помощью константа-выражение. [...] Следующие конструкции разрешены в константных выражениях :

  • Литералы (включая ноль Буквальный)
  • Ссылки на константные члены классов и структурных типов.
  • Ссылки на членов перечислимых типов.
  • Заключенные в скобки подвыражения, которые сами являются константными выражениями.
  • Приведение выражений при условии, что целевой тип является одним из перечисленных выше типов.
  • Предопределенные проверенные и непроверенные, +, -,! И ~ унарные операторы.
  • Предопределенные +, -, *, /,%, <<, >>, &, |, ^, &&, ||, ==,! =, <,>, <= И> = бинарные операторы, при условии, что каждый операнд имеет тип, перечисленный выше.
  • ?: Условный оператор.
  • размер выражений при условии неуправляемый тип является одним из типов указано в §14.5.12.
  • значение по умолчанию выражения, при условии, что тип один из перечисленных выше типов, или тип это ссылочный тип или тип параметр, который известен как ссылочный тип (§25.7).

следующее преобразования разрешены в постоянных выражения:

  • Идентификационные преобразования
  • Числовые преобразования
  • Перечисление преобразований

Другой способ достичь желаемого - использовать статический член только для чтения. Члены только для чтения оцениваются во время выполнения, а не во время компиляции. Поэтому вы можете использовать метод ToString ().

private static readonly EscapeString = EscapeChar.ToString();

Примечание: Поскольку поле только для чтения может быть инициализировано либо в объявлении, либо в конструкторе класса, поля только для чтения могут иметь различных значений в зависимости от используемого конструктора .

Вот хорошая статья о различиях между const и readonly .

5 голосов
/ 04 января 2009

Я не вижу никакого способа сделать это, что, я согласен, немного жаль, но вам действительно нужно , чтобы это было const вместо static readonly? Последний будет иметь почти такую ​​же семантику.

1 голос
/ 15 декабря 2014

C # .Net const требует его значения, инициализированного во время компиляции. Вот почему ваш код не компилируется. Вы можете использовать поле только для чтения, чтобы назначить значение времени выполнения.

Однако будет работать следующий код:

const char EscapeChar = '\\';
readonly string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
1 голос
/ 04 января 2009

Единственное, о чем я могу думать (оба не идеальные):

const string EscapeString = "\\";
private static readonly EscapeString = EscapeChar.ToString();

Или вы можете просто использовать версию char и ToString (), когда вам нужна строковая версия:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...