我使用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’赋予不同的含义,它已经在‘子’作用域中用来表示"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。
发布于 2015-06-05 09:36:59
为什么第一个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
}之所以很难读到get,是因为第二个'i‘只能在声明之后使用,但是它的作用域是整个外部块。
发布于 2015-06-05 09:37:50
您提到的文章在这里是不相关的,因为在循环变量上没有闭包。
所发生的情况是,在封闭作用域中有一个同名的变量。这是不允许的(至少对于从方法开始的作用域来说是如此)。如果尝试在gridView循环或嵌套块中声明for,也会遇到同样的问题。
但是,您可以使用相同的变量名使两个循环相邻,因为它们不重叠。还请注意,变量作用域是由块决定的,即使您只能在声明它们之后才能访问它们。这意味着即使您的foreach循环在声明第二个gridView变量之前,它们的作用域也是重叠的。
https://stackoverflow.com/questions/30663128
复制相似问题