Posts
83
Comments
165
Trackbacks
11
novembre 2007 Blog Posts
[C#] Il compilatore C# e un comportamento bizzaro

La scorsa settimana, durante un corso, un ragazzo mi ha fatto notare un comportamento del compilatore C#, che a prima vista può sembrare alquanto bizzarro.
Il pezzo di codice incriminato è il seguente (o meglio "simula", più o meno fedelmente, quanto proposto in aula):

Compilando questo codice, il compilatore ci "sbatte" in faccia il seguente errore:

"A local variable named 'text' cannot be declared in this scope because it would give a different meaning to 'text', which is already used in a 'child' scope to denote something else"

Ma come?
Pensavo proprio che lo scope della terza variabile di nome text, "prendesse vita" nel momento in cui veniva dichiarata in modo da non "disturbare" la creazione delle altre due variabili con lo stesso nome in blocchi differenti.

Bhe, sicuramente è un comportamento particolare del compilatore, giustificato/giustificabile leggendo attentamente le specifiche del linguaggio, che recitano, bene o male (ho fatto copia e incolla ... quindi credo di avere poche possibilità di errore :-P), così:

"The scope of a local variable declared in a local-variable-declaration is the block in which the declaration occurs. It is an error to refer to a local variable in a textual position that precedes the local-variable-declarator of the local variable. Within the scope of a local variable, it is a compile-time error to declare another local variable or constant with the same name."

Ovvero, la visibilità della terza variabile di nome text, seppur definita successivamente alle altre due, caratterizzate tra l'altro da due scope 'child' (rettangoli rossi), è tutto il blocco nella quale tale variabile è stata definita (rettangolo blu).

La mia opinione personale è che tale comportamento è da ascrivere ad un controllo che il compilatore fa sul codice che noi scriviamo per garantirne una minore possibilità di errore. Anche perchè, per ovviare a tale "problema" basta esplicitare la nostra necessità di avere tre variabili con lo stesso nome nello stesso metodo (ma chi mai potrebbe avere una tale necessità? :-S) identificando un ulteriore blocco che "limiti" la visibilità della terza variabile text:

Sperando di non aver interpretato male le specifiche, mi auguro di aver soddisfatto la curiosità di Luigi ;-)
Alla prossima

-melkio-

posted @ venerdì 30 novembre 2007 12:00 | Feedback (2)