You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中构造函数内与类内同名变量为何被判定为不同变量?

核心规则解答

  • 关于嵌套作用域的遮蔽规则
    C#采用层级作用域设计,子作用域可以声明和外层作用域同名的变量,此时子作用域内的同名变量会遮蔽外层变量,默认优先指向当前作用域的新变量。你代码里类级别声明的public int i =5是类成员字段,作用域属于类层级;构造函数内声明的int i=2是构造函数的局部变量,属于类作用域下的嵌套子作用域,二者属于不同作用域的两个独立变量,因此不会冲突。
    如果需要在构造函数内访问被遮蔽的类成员字段,使用this.i即可指向类层级的成员变量。

  • 关于重复声明的判定规则
    C#仅禁止同一作用域内的同名变量重复声明,不同层级的嵌套作用域不受该限制:

    • 如果你在构造函数内部连续两次声明int i,属于同一作用域重复声明,编译器会直接报错。
    • 类成员字段和构造函数局部变量属于不同层级作用域,不属于重复声明,因此编译器允许。

代码运行结果说明

你提供的代码执行逻辑如下:

using System;

namespace Modifier
{
    public class weird
    {
       // 类级别成员字段i,初始值5
       public int i = 5;

       public weird()
       {
            // 构造函数作用域局部变量i,初始值2,遮蔽外层类成员i
            int i = 2;
            // 输出当前作用域的局部变量i:2
            Console.WriteLine("Variable inside the constructor: "+i);
        }

        public void display()
        {
            // 该方法内没有声明同名局部变量,直接访问类成员字段i:5
            Console.WriteLine("Result:"+i);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var example = new weird(); // 调用构造函数,第一行输出2
            example.display();         // 调用display方法,第二行输出5     
        }
    }
}

运行输出为:

Variable inside the constructor: 2
Result:5

内容的提问来源于stack exchange,提问作者Vishnu Suvarnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:15:03