局部函数中作用域概念的行为:为何局部函数内重定义变量不报错?
局部函数与块级作用域的变量命名差异解析
先看前两段报错的代码:
static void Main(string[] args) { int a = 10; if (true) { int a = 10; } }
static void Main(string[] args) { int a = 10; { int a = 100; } }
这两段报错的原因很直接:C#里,if块、普通代码块这类块级作用域是外层函数作用域的直接嵌套子集,内层块和外层共享同一作用域链层级,不允许在这种嵌套块里声明和外层同名的局部变量——编译器会判定这是重复定义,直接报错。
再看你疑惑的这段不报错的代码:
static void Main(string[] args) { int a = 10; void Local() { int a = 100; } }
这里的关键是局部函数拥有独立的函数作用域,它和外层的Main函数作用域完全分离。局部函数内部声明的a,是属于这个函数自己的局部变量,和外层Main里的a是两个完全独立的实体,彼此的作用域互不渗透。编译器会分别处理这两个变量,自然不会出现命名冲突的问题。
内容的提问来源于stack exchange,提问作者Ekin Ekin




