关于if块

时间:2018-08-23 10:20:17

标签: c# variables scope

这段代码怎么来

if(...)
{
    string b = "Hello";
}
if(...)
{
    string b = "World";
}

很好,而这

if(...)
{
    string b = "Hello";
}
if(...)
{
    string b = "World";
}

string b = "Foo";

不是吗?

它产生

  

不能在此范围内声明局部变量“ b”,因为它会赋予“ b”不同的含义,“ b”已被用于父级或当前范围,以表示其他内容。

(重点是我的)。

据我了解,string b = "Foo"是在方法范围中定义的,因此在{strong>同一范围中都没有与{{ {1}}块,它也不是父范围

此外,由于示例(1)完美运行,我发现string b = "Hello";块具有自己的封闭范围(因此没有冲突)。

在示例(2)中,if块为何也没有“封闭”范围?

2 个答案:

答案 0 :(得分:2)

仅考虑范围,您的第二个代码与此等效:

string b = "Foo";
if(...)
{
    string b = "Hello";
}
if(...)
{
    string b = "World";
}

在这里,您发现您确实需要为b进行大胆的尝试,其中一个在外部作用域,另一个在内部作用域。这意味着声明的出现顺序无关紧要。此外,作用域绝不仅限于自身,还限于所有子范围。因此,在您的情况下,string b = "Foo"的范围(似乎是方法范围)包含 entire 方法,因此也包含if块的范围。但是后者不包括该方法的范围。

另一方面,在您的第一个示例中,变量仅位于内部范围内。

答案 1 :(得分:2)

在示例1中,您正确认识到b的作用域为if语句。因此,您无法在if语句之外访问其值,因为b超出范围。声明是很好的,因此在每个if块中声明一个具有相同名称的新变量也很好。

在示例2中,b的作用域为包含if块的方法。 if块可以访问范围更大的所有变量,因此在它们的范围内已经存在一个变量b。这就是为什么您不能在if语句中声明新变量b的原因。