Qual è l'ambito della variabile locale dichiarato in Linq Query.ambito variabile locale in metodo linq anonimo (chiusura)
stavo scrivendo seguente codice
static void Evaluate()
{
var listNumbers = Enumerable.Range(1, 10).Select(i => i);
int i = 10;
}
compilatore errore segnalato on line int i = 10, affermando
A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else
Non riesco a capire perché questo errore è in arrivo.
La mia comprensione è che i
diventerà fuori campo dopo la prima riga (nel ciclo foreach). Quindi, i
può essere dichiarato di nuovo.
Il comportamento effettivo è che non è possibile accedere a i
dopo la prima riga (nel ciclo foreach), che è corretto. Ma i
non può essere dichiarato di nuovo. Questo sembra strano.
EDIT Questa è una domanda seguente basata sulla risposta di Andras. La risposta è molto buona, ma causa ulteriori dubbi.
static void Evaluate3()
{
var listNumbers = Enumerable.Range(1, 10).Select(i => i);
var listNumbers1 = Enumerable.Range(1, 10).Select(i => i);
}
Sulla base della logica della funzione Valutare che .Select (i => i), e int i = 10, entrambi i, sono locali operato blocco e quindi errori complicazione.
Funzione Evaluate3 non dovrebbe compilare così come ci sono due nel blocco del metodo, ma si sta compilando correttamente senza alcun avviso/errore.
Domanda: Sia Evaluate che Evaluate3 non devono essere compilati, o entrambi devono essere compilati.
Sei sicuro che sia un problema con l'istruzione linq? Se lo rifai come '.Seleziona (x => x)' l'errore scompare davvero? –
questo problema non è correlato a LINQ. è correlato all'espressione lamda all'interno di linq. .Seleziona (x => x) -> si l'errore va via – Tilak
Usiamo linq in modo esteso e non mi è mai capitato di attraversarlo. Ho provato e ho la stessa lamentela. Quello che considero più strano è che posso avere 'var listNumbers = Enumerable.Range (1, 10) .Select (i => i); var listNumbers2 = listNumbers.Cast() .Seleziona (i => i); 'e questo non genera un errore anche se sto usando lo stesso nome di variabile, una volta come numero intero e una volta come stringa. Sembra che il secondo uso di 'i' dovrebbe causare anche un errore ... –