Подтвердить что ты не робот

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 - тип значения, не так ли? Почему я не могу присвоить значение и сделать переменную неизменной таким образом?

4b9b3361

Ответ 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