¿Por qué mi parámetro x
se comporta de forma errática?Clarificación de alcance Lambda
- Ejemplo 1 - No existe en el contexto actual.
- Ejemplo 2: No se puede reutilizar
x
porque está definido en un ámbito "secundario". - Ejemplo 3 - Bien. Esta es la parte en la que estoy confundido. Tal vez un alcance 'infantil' diferente?
Ejemplo 1:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var result = list.Where(x => x < 3);
Console.Write(result.ElementAt(x));
crea esta compilación error de tiempo:
The name 'x' does not exist in the current context
que espero.
Ejemplo 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));
produce este error de tiempo de compilación:
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
entiendo el alcance como respondida en esta pregunta, Is there a reason for C#'s reuse of the variable in a foreach?. Sin embargo, esto es algo que nunca he visto antes. Además, las respuestas a esta pregunta, What is the scope of a lambda variable in C#?, son incompletas o incorrectas.
Ejemplo 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);
No hay errores producidos.
Con la respuesta aceptada, estas publicaciones de blog de Eric Lippert me ayudaron a entender lo que estaba sucediendo. Si alguien todavía se confunde:
[aquí] (http://blogs.msdn.com/b/ericlippert/archive/2009/11/02 /simple-names-are-not-so-simple.aspx) son dos [enlaces] relevantes (http://blogs.msdn.com/b/ericlippert/archive/2009/11/05/simple-names-are- not-so-simple-part-two.aspx) sobre el tema. – Servy
posible duplicado de [ámbito de variable local en el método anónimo de linq (cierre)] (http://stackoverflow.com/questions/10517964/local-variable-scope-in-linq-anonymous-method-closure) – Magnus
posible duplicado de [ ¿Cuál es el alcance de una variable lambda en C#?] (Http://stackoverflow.com/questions/10494074/what-is-the-scope-of-a-lambda-variable-in-c) – nawfal