c# foreach变量作用域

本文关键字:作用域 变量 foreach | 更新日期: 2023-09-27 17:53:27

我在使用c# foreach循环时遇到了一个奇怪的问题,我不明白为什么。谁能告诉我这段代码有什么问题?

        var previouslyLoadedControls = ComposantPanel.Controls.OfType<GridView>().Where(x => x.Rows.Count > 0);
        foreach (var gridView in previouslyLoadedControls)
        {
            gridView.DataSource = null;
            gridView.DataBind();
        }
        var gridViewId = "GridViewOne";
        var gridView = (GridView)ComposantPanel.FindControl(gridViewId);
        gridView.DataSource = objects;
        gridView.DataBind();
        gridView.Visible = true;

编译器告诉我"一个名为'gridView'的局部变量不能在这个范围内声明,因为它会给'gridView'一个不同的含义,它已经在'子'范围内用于表示其他东西" at line "var gridView = (gridView)ComposantPanel.FindControl(gridViewId);

为什么第一个gridView变量只能在foreach循环作用域中访问?

如果我只是评论第二个gridView声明出来然后编译器告诉我"名称'gridView'不存在于当前上下文中"在"gridView。DataSource = objects;那么foreach变量的作用域是什么呢?

我开始阅读一些关于闭包的文章(http://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/和http://csharpindepth.com/Articles/Chapter5/Closures.aspx),但我仍然不明白。

我使用的是VS 2013和。net 4.5.1和c# 5。

c# foreach变量作用域

为什么第一个gridView变量只能在foreach循环作用域中访问?

是的,但是编译器(语言定义)只是禁止重叠作用域。

产生相同错误的简化版本:

{   // outer block, scope for the second `i`
    for(int i = 0; i < 10; i++)  // nested 'i', the first we see
    {
       // scope of first `i`  
    }
    int i = 3;  // declaration of a second `i`, not allowed
}

很难读取和获取的原因是第二个'i'可能只在声明之后使用,但它的作用域是整个外部块。

参见c#语言规范,§3.7:范围

您提到的已阅读的文章在这里是无关的,因为您没有对循环变量的闭包。

的情况是,在封闭作用域中有一个同名的变量。这是不允许的(至少对于以方法开始的作用域)。你有同样的问题,如果你试图声明gridViewfor循环或只是一个嵌套块。

你可以有两个循环相邻使用相同的变量名,但是,因为它们不重叠。还要注意,变量范围是由块决定的,尽管只有在声明了它们之后才能访问它们。这意味着即使您的foreach循环在声明第二个gridView变量之前,它们的作用域也会重叠。