局部变量不能在此范围内声明[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);

表达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'

这就是为什么存在歧义,为什么不允许。


解决方法是简单地为您的lambda选择一个不同的变量名称; 例如:

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

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

您不能将C#闭包的作用域视为独立的函数作用域。

您不能在当前范围外返回复杂的Linq表达式。

JavaScript允许这种不明确性,它允许无限制地编写闭包,这使闭包JavaScript的一流功能成为可能。

链接地址: http://www.djcxy.com/p/53043.html

上一篇: A local variable cannot be declared in this scope[Linq/Lambda expression]

下一篇: Get Element at N position in an Array without Loop