2010-08-03 28 views
20

Con una gran cantidad de C++ fondo me he acostumbrado a escribir lo siguiente:CS0133 "La expresión asignada a 'identificador' debe ser constante" - ¿cuál es la razón detrás de eso?

const int count = ...; //some non-trivial stuff here 
for(int i = 0; i < count; i++) { 
    ... 
} 

y espera que el mismo habría ningún problema en C#. Sin embargo ...

byte[] buffer = new byte[4]; 
const int count = buffer.Length; 

produce CS0133 de error: La frase siendo asignado a 'contar' debe ser constante.

No lo entiendo. ¿Por qué es eso inválido? int es un tipo de valor, ¿verdad? ¿Por qué no puedo asignar un valor y hacer que la variable sea inmutable de esta manera?

Respuesta

20

Debido const en C# es mucho más que constconst en C++. ;)

En C#, const se utiliza para denotar un tiempo de compilación expresión constante. Sería similar a este código C++:

enum { 
    count = buffer.Length; 
} 

Debido buffer.Length se evalúa en tiempo de ejecución, no es una expresión constante, por lo que esto produciría un error de compilación.

C# tiene una palabra clave readonly que es un poco más similar a C++ 's const. (Es aún mucho más limitada, sin embargo, y no hay tal cosa como const-corrección en C#)

+0

¿Cuál es la limitación frente a lo que cabe esperar de const? Y uf, no estoy seguro de haber seguido la definición de Wikipedia de "const-correctness".¿Solo que usa const cuando sea apropiado? ¿Cómo funciona Readonly Bork esa corrección? – ruffin

+2

@ruffin: en C#, const y readonly solo se puede aplicar a los miembros de la clase. En C++, const no significa "constante de tiempo de compilación", sino que "no se modificará". Puede tener métodos de miembros const (es decir, no modifican la clase de la que son miembros, por lo que si tiene un objeto const, solo puede invocar métodos const. Los parámetros de función pueden ser const, (otra vez) , lo que significa que la función que se está llamando no puede modificar los parámetros ni llamar a funciones miembro no constantes). – jalf

+2

Esto le permite crear una noción de "const-correctness". Es decir, puede distinguir entre "modificar" y funciones "no modificables", y detectar en tiempo de compilación si accidentalmente intentas realizar una operación de modificación en un objeto const. Puedes definir una clase para limitar las operaciones que se pueden realizar si es const, y si lo haces de manera consistente a través de su programa, es const-correct. Cualquier intento de violación de constness "lógico" se convierte en un error en tiempo de compilación. – jalf

11

const está destinado a representar una constante de tiempo de compilación ... no sólo un valor de sólo lectura.

No se puede especificar, pero no el tiempo de compilación-constantes variables locales en C# sólo lectura, me temo. Algunas variables locales son intrínsecamente de solo lectura, como la variable de iteración en un bucle foreach y cualquier variable declarada en la primera parte de una declaración using. Sin embargo, no puede crear sus propias variables de solo lectura.

Si usa const dentro de un método, eso reemplaza efectivamente cualquier uso de ese identificador con el valor constante de tiempo de compilación. Personalmente, rara vez he visto esto utilizado en el código C# real.

5

No se puede asignar un número variable a un const. Es una constante de tiempo de compilación.

Desde el C# referencia en const:

Una expresión constante es una expresión que se puede evaluar completamente en tiempo de compilación.

2

en cuenta también que en C#, el modificador readonly sólo está disponible para las variables miembro, no para las variables locales (es decir, definido dentro de un método).

Microsoft probablemente debería haber sido más específico en la guía de referencia C#:
http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

+0

Las consteciones locales están permitidas, como se menciona en la respuesta de Jon Skeet. – Blorgbeard

+0

Mi mal; editado para reflejar esto. – sn00gan

Cuestiones relacionadas