为什么我的参数x
表现得如此不规律?
x
,因为它是在“子”范围内定义的。例1:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var result = list.Where(x => x < 3);
Console.Write(result.ElementAt(x));
创建此编译时错误:
当前上下文中不存在名称“x”
我期待的。
例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));
产生这个编译时错误:
名为'x'的局部变量不能在此范围内声明,因为它会给'x'赋予不同的含义,'x'已在'子'范围内用于表示其他内容
我理解在这个问题中回答的范围,Is there a reason for C#'s reuse of the variable in a foreach?。然而,这是我以前从未见过的。此外,它使这个问题的答案,What is the scope of a lambda variable in C#?,不完整或错误。
例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);
没有产生错误。
在qazxsw pi中,x在lambda表达式的局部范围内定义,并且对第三行不可见
在Example 1
中,现在你已经在同一声明范围内声明了两个名为“x”的变量(可见性不同)
使用lambda或匿名方法,它“捕获”它运行的范围。如果你有一个与lambda定义相同范围的本地x,那么它“捕获”x以拉入lambda可以访问的内容 - 从而产生两个“x”定义。您在lambda中声明的内容不会被捕获到另一个方向,因此它在lambda外部不可见。
在Example 2
中,现在你没有使用本地的变量只是lambda之外的lambda,而不是在同一声明范围内命名相同的东西。
子范围(示例3)可以使用相同的变量,但父级和子级不能重新声明变量。
您可以获得相同的:
Example 3
这会失败:
// Child scopes
for (int i = 1; i < 10; i++){ /* do something */ }
for (int i = 1; i < 10; i++){ /* do something else */ }
它似乎并不复杂。
如果为lambda表达式定义参数,则该参数仅在lambda表达式的范围内有效
// Child and parent
for (int i = 1; i < 10; i++){ /* do something */ }
int i = 33;
如果你有一个第二个变量,其定义在与lamda表达式相同的范围内,你将得到一个错误,因为这个第二个变量在lamda表达式的范围内也是有效的。
(int x) =>
{
//x is only valid inside this scope
}
在第三个示例中,您有两个不同的lambda表达式,因此有两个不同的范围