这段代码怎么来
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
块为何也没有“封闭”范围?
答案 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
的原因。