我使用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;
编译器告诉我&#34;一个名为&#39; gridView&#39;的局部变量。不能在这个范围内声明,因为它会给'gridView&#39;提供不同的含义,这已经在一个孩子中使用过了。&#39;范围表示别的东西&#34; at line&#34; var gridView =(GridView)ComposantPanel.FindControl(gridViewId);&#34;
为什么不能在foreach循环范围中访问第一个gridView变量?
如果我只是评论第二个gridView声明,那么编译器会告诉我&#34;名称&#39; gridView&#39;在当前背景下不存在&#34; at&#34; gridView.DataSource = objects;&#34;。那么我的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。
答案 0 :(得分:1)
为什么不能在foreach循环范围中访问第一个gridView变量?
确实如此,但编译器(语言定义)只是禁止重叠范围。
产生相同错误的简化版本:
{ // 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
}
这个难以理解的原因是第二个&#39; i&#39;只能在声明后使用,但其范围是整个外部块。
答案 1 :(得分:0)
你提到的文章在这里是无关紧要的,因为你没有对循环变量进行闭包。
在封闭范围内,您有一个同名变量。这是不允许的(至少对于从方法开始的范围)。如果您尝试在gridView
循环中声明for
或仅在嵌套块中声明foreach
,则会遇到同样的问题。
但是,您可以使用相同的变量名称将两个循环彼此相邻,因为它们不会重叠。另请注意,变量范围由块确定,即使您只能在声明它们之后才能访问它们。这意味着,即使您的gridView
循环之前是,您声明了第二个class SelectableItem<T> {
private T item;
private boolean selected;
public SelectableItem(T item, boolean selected) {
....
}
// getters setters
}
变量,但它们的范围也会重叠。