Имею следующий код
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 значит, что поле должно быть инициализировано в конструкторе и последующая модификация данного поля запрещена. Т.е. это гарантия того, что раз поле проинициализировано в конструкторе, оно больше не может быть изменено в других частях класса. Но это не делает его сущностью времени компиляции — нет, оно защищено от переинициализации, но не является константным.
Подробнее в документации
Комментариев нет:
Отправить комментарий