不能在此范围内声明局部变量[Linq / Lambda表达式]

|| 我在C#中有以下代码片段
static void Main()
{
    var numbers = new[] { 1, 2, 3, 4, 5, 6 };

    var ngt5 = numbers.Where(n => n > 5);

    var n = ngt5.First().ToString();

    Console.WriteLine(n, numbers);
}
当我编译上面的代码时,出现以下错误 在此范围内不能声明名为\'n \'的局部变量     
已邀请:
        您的问题在这里:
// Within your lambda you have an \'n\'.
var ngt5 = numbers.Where(n => n > 5);

// And within the outer scope you also have an \'n\'.
var n = ngt5.First().ToString();
要了解为什么这是一个问题,请考虑以下代码:
int n = 1000;
var evens = Enumerable.Range(1, 1000).Where(n => n % 2 == 0);
上面的ѭ3expression表示模棱两可:我们在谈论哪个which4ѭ?如果我们谈论的是外部
n
,那么
n % 2 == 0
总是正确的,因为
n
只是1000(因此
evens
将包含从1到1000的所有数字)。另一方面,如果我们谈论内部the4ѭ,则ѭ3then仅对even4ѭ的偶数值成立(and8ѭ将为2、4、6,... 1000)。 要意识到的重要一点是,可以在lambda范围内访问在lambda外部声明的变量。
int n = 0;
Action incrementN = () => n++; // accessing an outer variable
incrementN();
Console.WriteLine(n); // outputs \'1\'
这就是为什么存在歧义的原因,因此也不允许这样做。 解决方案就是为lambda选择一个不同的变量名。例如。:
var ngt5 = numbers.Where(x => x > 5);
    
        您的问题是您假设闭包是C#中的一流函数,但事实并非如此,我希望情况确实如此。 您不能将C#闭包的范围视为隔离的函数范围。 您不能在当前范围之外返回复杂的Linq表达式。 JavaScript允许这种歧义,这允许编写闭包而没有任何限制,这使得闭包成为JavaScript的一流函数。     

要回复问题请先登录注册