Dlaczego mój parametr x
zachowuje się tak nieregularnie?Wyjaśnienie zakresu Lambda
- Przykład 1 - Nie istnieje w bieżącym kontekście.
- Przykład 2 - Nie można ponownie użyć
x
, ponieważ jest zdefiniowany w zakresie "podrzędnym". - Przykład 3 - Dobrze. To jest ta część, w której jestem zdezorientowany. Może inny zakres "dziecka"?
Przykład 1:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var result = list.Where(x => x < 3);
Console.Write(result.ElementAt(x));
tworzy ten błąd czasu kompilacji:
The name 'x' does not exist in the current context
które oczekują.
Przykład 2:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var result = list.Where(x => x < 3);
int x = 1;
Console.Write(result.ElementAt(x));
produkuje ten błąd kompilacji:
A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a 'child' scope to denote something else
Rozumiem scopingu jak odpowiedzieć na to pytanie, Is there a reason for C#'s reuse of the variable in a foreach?. Jest to jednak coś, czego nigdy wcześniej nie widziałem. Ponadto sprawia, że odpowiedzi na to pytanie, What is the scope of a lambda variable in C#?, niekompletne lub błędne.
Przykład 3:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
List<string> stringList = new List<string> { "A", "B" };
var result = list.Where(x => x < 3);
var result2 = stringList.Where(x => x != "A");
Console.Write(result2);
żadne błędy wytwarzane.
Dzięki przyjętej odpowiedzi, te posty na blogu od Erica Lipperta pomogły mi objąć głowę tym, co się dzieje. Jeśli ktoś jest wciąż zamieszana
[tutaj] (http://blogs.msdn.com/b/ericlippert/archive/2009/11/02 /simple-names-are-not-so-simple.aspx) to dwa istotne [linki] (http://blogs.msdn.com/b/ericlippert/archive/2009/11/05/simple-names-are- nie tak prosty-część-dwa.aspx) na ten temat. – Servy
możliwy duplikat [lokalnego zakresu zmiennych w anonimowej metodzie linq (zamknięcie)] (http://stackoverflow.com/questions/10517964/local-variable-scope-in-linq-anonymous-method-closure) – Magnus
możliwy duplikat [ Jaki jest zakres zmiennej lambda w C#?] (Http://stackoverflow.com/questions/10494074/what-is-the-skope-of-a-ambambda-variable-in-c) – nawfal