You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

局部函数中作用域概念的行为:为何局部函数内重定义变量不报错?

局部函数与块级作用域的变量命名差异解析

先看前两段报错的代码:

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

火山引擎 最新活动