首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#预见变量范围

C#预见变量范围
EN

Stack Overflow用户
提问于 2015-06-05 09:34:49
回答 2查看 3.7K关注 0票数 2

我使用C# foreach循环运行了一个奇怪的问题,但我不明白为什么。有人能解释一下这段代码有什么问题吗?

代码语言:javascript
运行
复制
        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’赋予不同的含义,它已经在‘子’作用域中用来表示"var gridView=gridView”行中的其他东西“。

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

如果我只对第二个gridView声明进行注释,编译器就会在"gridView.DataSource =objects“处告诉我”名称'gridView‘在当前上下文中不存在“。那么,我的foreach变量的作用范围是什么?

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

我在.Net 4.5.1和C# 5中使用VS 2013。

EN

回答 2

Stack Overflow用户

发布于 2015-06-05 09:36:59

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

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

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

代码语言:javascript
运行
复制
{   // 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
}

之所以很难读到get,是因为第二个'i‘只能在声明之后使用,但是它的作用域是整个外部块。

请参阅C#语言规范,§3.7:作用域

票数 1
EN

Stack Overflow用户

发布于 2015-06-05 09:37:50

您提到的文章在这里是不相关的,因为在循环变量上没有闭包。

所发生的情况是,在封闭作用域中有一个同名的变量。这是不允许的(至少对于从方法开始的作用域来说是如此)。如果尝试在gridView循环或嵌套块中声明for,也会遇到同样的问题。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30663128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档