CS0133 "Выражение, присвоенное" идентификатору ", должно быть постоянным" - в чем причина этого?
С большим количеством фона С++ я привык писать следующее:
const int count = ...; //some non-trivial stuff here
for( int i = 0; i < count; i++ ) {
...
}
и я ожидал, что то же самое будет отлично работать на С#. Однако...
byte[] buffer = new byte[4];
const int count = buffer.Length;
вызывает ошибку CS0133: выражение, присвоенное "count", должно быть постоянным.
Я не понимаю. Почему это недействительно? int
- тип значения, не так ли? Почему я не могу присвоить значение и сделать переменную неизменной таким образом?
Ответы
Ответ 1
Потому что const
в С# намного больше const
, чем const
в С++.;)
В С#, const
используется для обозначения выражения константы времени компиляции. Он будет похож на этот код на С++:
enum {
count = buffer.Length;
}
Поскольку buffer.Length
оценивается во время выполнения, это не постоянное выражение, и поэтому это приведет к ошибке компиляции.
С# имеет ключевое слово readonly
, которое немного больше похоже на С++ const
. (Тем не менее он еще более ограничен, и в С# нет такой вещи, как const-correctness)
Ответ 2
const
предназначен для представления константы времени компиляции... не только для значения, доступного только для чтения.
Я не могу указать локальные переменные только для чтения, но не связанные с компиляцией, в С#. Некоторые локальные переменные по своей сути доступны только для чтения, такие как переменная итерации в цикле foreach
и любые переменные, объявленные в части fisrt оператора using
. Однако вы не можете создавать свои собственные переменные только для чтения.
Если вы используете const
внутри метода, который эффективно заменяет любое использование этого идентификатора значением постоянной времени компиляции. Лично я редко видел, что это используется в реальном коде С#.
Ответ 3
Вы не можете присвоить номер переменной const
. Это постоянная времени компиляции.
Из ссылки С# на const:
Постоянное выражение - это выражение, которое может быть полностью оценено во время компиляции.
Ответ 4
Также обратите внимание, что в С# модификатор readonly
доступен только для переменных-членов, не для локальных переменных (т.е. определенных внутри метода).
Microsoft, вероятно, должна была быть более конкретной в справочнике С#:
http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx