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

san*_*ngh 6 c# linq

我在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);
}
Run Code Online (Sandbox Code Playgroud)

当我编译上面的代码时,我得到以下错误

名为"n"的局部变量不能在此范围内声明

Dan*_*Tao 17

你的问题在这里:

// 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();
Run Code Online (Sandbox Code Playgroud)

要了解这是一个问题,请考虑以下代码:

int n = 1000;
var evens = Enumerable.Range(1, 1000).Where(n => n % 2 == 0);
Run Code Online (Sandbox Code Playgroud)

n % 2 == 0上面的表达含糊不清:n我们在谈论哪些?如果我们谈论的 n,然后n % 2 == 0一直如此,因为n仅仅是1000(并因此evens将包括所有号码从1到1000).另一方面,如果我们谈论的是内在 n,那么n % 2 == 0只有n(甚至evens是2,4,6,...... 1000)的值才会成立.

要认识到的重点是,在lambda范围内可以访问在lambda之外声明的变量.

int n = 0;
Action incrementN = () => n++; // accessing an outer variable
incrementN();
Console.WriteLine(n); // outputs '1'
Run Code Online (Sandbox Code Playgroud)

这就是为什么存在歧义,以及为什么不允许这样做的原因.


解决方案就是为lambda选择一个不同的变量名称; 例如:

var ngt5 = numbers.Where(x => x > 5);
Run Code Online (Sandbox Code Playgroud)