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];