C#局部变量作用域可能重复:与c#中的作用域混淆看起来在C#中,用局部作用域定义的if/else/loop块与Variablesdefinedwith后面的块分开冲突变量-请参阅代码片段。在C/C++和Java下,等效代码编译得很好。这是C#中的预期行为吗?publicvoidf(){if(true){/*localifscope*/inta=1;系统。安慰。写行(一);}else{/*不与来自同一地方的if/else冲突*/inta=2;System.Console.WriteLine(a);}if(true){/*不与本地冲突if*/inta=3;System.Console.WriteLine(a);}/*这样做:*inta=5;*导致:错误1??无法在此范围内声明名为“a”的局部变量*因为它会给“a”赋予不同的含义,而“a”已在*“子”范围中用于表示其他内容*这表明(恕我直言,错误地)变量“a”在此范围内可见*//*这样做:*System.Console.WriteLine(a);*结果:错误1??当前上下文中不存在名称“a”。*这正确地表明变量“a”在此范围内不可见*/}是的,这就是C#的工作方式。声明作用域时,外部作用域中的任何局部变量也是已知的-无法确定作用域的局部变量应该覆盖外部的局部变量。这是正常行为。SamNg不久前写了一篇很好的博客文章:http://blogs.msdn.com/b/samng/archive/2007/11/09/local-variable-scoping-in-c.aspx你似乎在关注声明顺序(在if块之后重新声明)。考虑在if块之前声明它的情况。然后您会期望它在这些块的范围内可用。整数=1;如果(真){变量b=a+1;//从外部作用域访问ainta=2;//冲突}在编译时,实际上没有“超出范围”的概念。您实际上可以使用裸花括号创建内部作用域:{inta=1;}如果(真){inta=2;//有效,因为上面的a在此范围内不可访问}已经有一些不错的答案,但我查看了C#4语言规范以澄清这一点。我们可以在§1.24中阅读有关作用域的内容:Scopescanbenested,andinnerscopescanre-declarthemeaningofnamesfromouterscopes(however,thisdoesnotremovetherestrictionimposedby§1.20thatwithinnestedblocks,noMayusethe与封闭块中的局部变量同名。这是§1.20中引用的部分:声明在声明所属的声明空间中定义名称。重载成员除外(§1.23),如果两个或多个它是在声明空间中引入具有相同名称的成员的声明的编译时错误。声明空间永远不能包含具有相同名称的不同类型的成员[...]请注意,在函数成员或匿名内部函数体或函数成员或匿名函数体中出现的块嵌套在这些函数为其参数声明的局部变量声明空间中。是的。这是预期的,因为您在局部语句中定义变量。如果您要在以下位置定义变量班级,你会得到不同的结果。以上就是C#学习教程:C#局部变量作用域分享的全部内容。侵权请点击右侧联系管理员删除。如需转载请注明出处:
