局部变量范围错误 - foreach循环

时间:2014-04-05 11:05:35

标签: c# foreach scope

我有以下代码:

if (Current == false)
{
    foreach (var visual in visuals)
        visual.IsSelected = value;
}

Visual visual = visuals[currentIndex];

当我编译时,我有这个错误:

  

无法在此范围内声明名为“visual”的局部变量   因为它会给'视觉'赋予不同的含义,这是   已在'子'范围内用于表示其他内容

另外,如果我没有声明visual变量,那就是我替换:

Visual visual = visuals[currentIndex];

使用:

visual = visuals[currentIndex];

错误如下:

  

当前上下文中不存在名称'visual'

为什么会出现这种情况?

4 个答案:

答案 0 :(得分:1)

  

为什么会出现这种情况?

在你的第一个案例中,你已经在foreach循环中声明了名为visual的变量。

在第二种情况下,您无法使用关键字visual,因为它不存在。它只能在你的foreach循环中使用。

试试这个:

Visual visual1 = visuals[currentIndex];

答案 1 :(得分:1)

在第一种情况下,在外部和内部声明的变量之间存在歧义。(全局和本地)。

编译器对您所指的visual感到困惑。外部的一个或内部的?

在第二种情况下,编译器不知道什么是visual

详细了解here;

答案 2 :(得分: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];

答案 3 :(得分:1)

SonerGönül指出,第一个结构:

if (Current == false)
{
    foreach (var visual in visuals)
        visual.IsSelected = value;
}

Visual visual = visuals[currentIndex];
根据语言的定义,

是非法的。请参阅Soner提供的链接:

https://stackoverflow.com/a/2050864/447156

使这种非法行为减少了人类阅读代码时混淆的可能性。编译器可以将其视为合法,但语言的设计者感觉(并且我同意)这是使C#更容易理解的机会。