C# 局部变量范围错误-foreach循环
我有以下代码:C# 局部变量范围错误-foreach循环,c#,foreach,scope,C#,Foreach,Scope,我有以下代码: if (Current == false) { foreach (var visual in visuals) visual.IsSelected = value; } Visual visual = visuals[currentIndex]; 当我编译时,我有一个错误: 无法在此作用域中声明名为“visual”的局部变量 因为它会赋予“视觉”不同的含义,即 已在“child”范围中用于表示其他内容 另外,如果我没有声明visual变量,那么我将替换
if (Current == false)
{
foreach (var visual in visuals)
visual.IsSelected = value;
}
Visual visual = visuals[currentIndex];
当我编译时,我有一个错误:
无法在此作用域中声明名为“visual”的局部变量
因为它会赋予“视觉”不同的含义,即
已在“child”范围中用于表示其他内容
另外,如果我没有声明visual
变量,那么我将替换:
Visual visual = visuals[currentIndex];
与:
错误如下:
当前上下文中不存在名称“visual”
为什么会有这种行为
为什么会有这种行为
在第一种情况下,您已经在foreach循环中声明了名为visual
的变量
在第二种情况下,您不能使用关键字visual
,因为它不存在。它仅在foreach循环中可用
试试这个:
Visual visual1 = visuals[currentIndex];
在第一种情况下,在外部和内部(全局和局部)声明的变量之间存在歧义 编译器对您所指的
visual
感到困惑。外面的还是里面的
在第二种情况下,编译器不知道什么是visual
阅读更多关于它的信息
及
正如Soner Gönül所指出的,第一种结构:
if (Current == false)
{
foreach (var visual in visuals)
visual.IsSelected = value;
}
Visual visual = visuals[currentIndex];
根据语言的定义是非法的。请参阅Soner提供的链接:
将此设置为非法可以减少人们阅读代码时产生混淆的机会。编译器可以将其视为合法,但语言的设计者认为(我也同意)这是一个让C更容易理解的机会。
,它已经在一个
子范围中被用来表示其他的
,因为在你的foreach
循环中有一个名为visual
的变量,这就是为什么会出现这个错误。@SonerGönül“第一”视觉的范围并不局限于if语句中?请查看Eric Lippert的回答。。它是由C#设计的。它减少了歧义。类似[问题][1][1]:
if (Current == false)
{
foreach (var visual in visuals)
visual.IsSelected = value;
}
// Parent and child scope have same variable name so it creates ambiguity.
Visual visual = visuals[currentIndex];
if (Current == false)
{
foreach (var visual in visuals)
visual.IsSelected = value;
}
// The variable visual in not defined outside the scope of if statement
visual = visuals[currentIndex];
if (Current == false)
{
foreach (var visual in visuals)
visual.IsSelected = value;
}
Visual visual = visuals[currentIndex];