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。
为什么第一个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:范围
您提到的已阅读的文章在这里是无关的,因为您没有对循环变量的闭包。
的情况是,在封闭作用域中有一个同名的变量。这是不允许的(至少对于以方法开始的作用域)。你有同样的问题,如果你试图声明gridView
在for
循环或只是一个嵌套块。
你可以有两个循环相邻使用相同的变量名,但是,因为它们不重叠。还要注意,变量范围是由块决定的,尽管只有在声明了它们之后才能访问它们。这意味着即使您的foreach
循环在声明第二个gridView
变量之前,它们的作用域也会重叠。