Страницы

Поиск по вопросам

четверг, 14 февраля 2019 г.

Switch использование readonly переменных в case

Имею следующий код
static void Main(string[] args) { string value = "value1"; // switch с const переменными работает switch(value) { case ConstVariable.VALUE1: Console.WriteLine(ConstVariable.VALUE1); break; case ConstVariable.VALUE2: Console.WriteLine(ConstVariable.VALUE2); break; case ConstVariable.VALUE3: Console.WriteLine(ConstVariable.VALUE3); break; }
// ЗДЕСЬ ОШИБКА!!! switch c readonly переменными не работает switch (value) { case ReadOnlyVariable.VALUE1: Console.WriteLine(ConstVariable.VALUE1); break; case ReadOnlyVariable.VALUE2: Console.WriteLine(ConstVariable.VALUE2); break; case ReadOnlyVariable.VALUE3: Console.WriteLine(ConstVariable.VALUE3); break; } }
static class ReadOnlyVariable { public static readonly string VALUE1 = "value1";
public static readonly string VALUE2 = "value2";
public static readonly string VALUE3 = "value3";
}
static class ConstVariable { public const string VALUE1 = "value1";
public const string VALUE2 = "value2";
public const string VALUE3 = "value3";
}
В блоке switch я могу использовать переменные const, но если я использую переменны readonly, то получаю ошибку
A constant value is expected
Почему так, разве переменные readonly на этапе компиляции не определяются?


Ответ

readonly значит, что поле должно быть инициализировано в конструкторе и последующая модификация данного поля запрещена. Т.е. это гарантия того, что раз поле проинициализировано в конструкторе, оно больше не может быть изменено в других частях класса. Но это не делает его сущностью времени компиляции — нет, оно защищено от переинициализации, но не является константным.
Подробнее в документации

Комментариев нет:

Отправить комментарий