2010-08-03 7 views
20

Con un sacco di C++ sfondo ho usato per scrivere il seguente:CS0133 "L'espressione assegnata a 'identificatore' deve essere costante" - qual è la ragione di ciò?

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

e mi aspettavo che lo stesso avrebbe funzionato bene in C#. Tuttavia ...

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

produce errore CS0133: L'espressione viene assegnato a 'contare' deve essere costante.

Non capisco. Perché è invalido? int è un tipo di valore, non è vero? Perché non posso assegnare un valore e rendere la variabile immodificabile in questo modo?

risposta

20

Perché const in C# è molto più di quanto constconst in C++. ;)

In C#, const viene utilizzato per indicare un'espressione costante in fase di compilazione. Sarebbe simile a questo codice C++:

enum { 
    count = buffer.Length; 
} 

Perché buffer.Length viene valutata in fase di esecuzione, non è un'espressione costante, e quindi questo produrrebbe un errore di compilazione.

C# ha una parola chiave readonly che è un po 'più simile a const di C++. (E 'ancora molto più limitati, però, e non v'è alcuna cosa come const-correttezza in C#)

+0

Qual è la limitazione rispetto a quello che ci si aspetta da const? E, beh, non sono sicuro di aver seguito la defn di "costituttezza" di Wikipedia.Solo che usa const se appropriato? In che modo legalmente legga questa correttezza? – ruffin

+2

@ruffin: in C#, const e readonly possono essere applicati solo ai membri della classe. In C++, const non significa "costante in fase di compilazione", ma "non sarà modificato". È possibile avere metodi membri const (che non modificano la classe di cui fanno parte, quindi, se si dispone di un oggetto const, è possibile richiamare solo i metodi const. I parametri della funzione possono essere const, (di nuovo , il che significa che la funzione chiamata non può modificare i parametri o chiamare su di essa funzioni membro non const.) – jalf

+2

Ciò consente di creare una nozione di "cost-correctness", ovvero, è possibile distinguere tra "modifica" e "non modificabile", e rileva in fase di compilazione se si tenta accidentalmente di eseguire un'operazione di modifica su un oggetto const. È possibile definire una classe per limitare le operazioni che possono essere eseguite su di esso se è const, e se lo si fa in modo coerente in tutto il tuo programma, è costante.Tutti i tentativi di violare la costanza "logica" diventa un errore in fase di compilazione – jalf

11

const è pensato per rappresentare una costante in fase di compilazione ... non solo un valore di sola lettura.

Non è possibile specificare variabili locali di sola lettura, ma non costanti di tempo di compilazione in C#, temo. Alcune variabili locali sono intrinsecamente di sola lettura, ad esempio la variabile di iterazione in un ciclo foreach e qualsiasi variabile dichiarata nella prima parte di un'istruzione using. Tuttavia, non puoi creare le tue variabili di sola lettura.

Se si utilizza const all'interno di un metodo, questo sostituisce in modo efficace qualsiasi utilizzo di di quell'identificatore con il valore della costante in fase di compilazione. Personalmente raramente ho visto questo usato nel codice C# reale.

5

Non è possibile assegnare un numero variabile a const. È una costante di tempo di compilazione.

Dalla # riferimento C su const:

Un'espressione costante è un'espressione che può essere pienamente valutata al momento della compilazione.

2

Si noti inoltre che in C#, il modificatore readonly è disponibile solo per le variabili membro, non per le variabili locali (cioè definito all'interno di un metodo).

Microsoft probabilmente avrebbe dovuto essere più preciso nella guida di riferimento # C:
http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

+0

Le consenti locali sono consentite, come menzionato nella risposta di Jon Skeet. – Blorgbeard

+0

Il mio male; modificato per riflettere questo. – sn00gan

Problemi correlati