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

时间:2011-05-27 17:29:31

标签: 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);
}

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

无法在此范围内声明名为“n”的局部变量

2 个答案:

答案 0 :(得分: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();

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

int n = 1000;
var evens = Enumerable.Range(1, 1000).Where(n => n % 2 == 0);

上面的n % 2 == 0表达式含糊不清:我们在讨论哪个n?如果我们谈论外部 n,那么n % 2 == 0 总是为真,因为n只有1000(因此{ {1}}将包含1到1000之间的所有数字。另一方面,如果我们谈论的是内部 evens,那么n只会对n % 2 == 0(和{{1}的偶数值成立将是2,4,6,...... 1000)。

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

n

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


解决方案只是为lambda选择一个不同的变量名称; e.g:

evens

答案 1 :(得分:0)

你的问题是你认为闭包是C#中的第一类函数,情况并非如此,我希望情况确实如此。

您不能将C#闭包的范围视为隔离函数范围。

您无法在当前范围之外返回复杂的Linq表达式。

JavaScript允许这种歧义,它允许在没有任何限制的情况下编写闭包,这使得闭包成为JavaScript的第一类函数。