Страницы

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

понедельник, 6 января 2020 г.

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

#c_sharp #типы_данных


Имею следующий код

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 на этапе компиляции не определяются?
    


Ответы

Ответ 1



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

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

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