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

嵌套类访问外部类非静态字段遇CS0120错误的解决办法咨询

C#内部类访问外部类非静态字段的解决办法

问题场景

你编写了如下C#代码:

public class Foo
{
    public string someString;

    public class Bar
    {
        public string ReturnSomething()
        {
            return someString;
        }
    }
}

运行时触发错误:

[CS0120] An object reference is required for the non-static field, method, or property 'Foo.someString'

你不想将someString改为静态字段,希望找到其他解决方式。

核心原因

内部类确实可以访问外部类的成员,但非静态字段属于外部类的实例,而非类本身。直接在内部类中引用someString时,编译器找不到对应的Foo实例,因此报错。要访问非静态成员,必须持有外部类的实例引用。

解决办法

方法一:给内部类添加外部类实例字段,通过构造函数注入

修改代码,让内部类Bar持有Foo的实例引用,通过构造函数传入:

public class Foo
{
    public string someString;

    public class Bar
    {
        private readonly Foo _fooInstance;

        // 构造函数接收Foo实例
        public Bar(Foo fooInstance)
        {
            _fooInstance = fooInstance;
        }

        public string ReturnSomething()
        {
            return _fooInstance.someString;
        }
    }
}

使用示例:

var foo = new Foo { someString = "Hello World" };
var bar = new Foo.Bar(foo);
Console.WriteLine(bar.ReturnSomething()); // 输出 Hello World

方法二:在外部类中提供创建内部类的方法,自动传入当前实例

如果Bar的创建通常依赖于Foo的实例,可以在Foo中封装创建逻辑,避免外部代码直接传入实例:

public class Foo
{
    public string someString;

    public class Bar
    {
        private readonly Foo _fooInstance;

        internal Bar(Foo fooInstance)
        {
            _fooInstance = fooInstance;
        }

        public string ReturnSomething()
        {
            return _fooInstance.someString;
        }
    }

    // 对外提供创建Bar的方法,自动传入当前Foo实例
    public Bar CreateBar()
    {
        return new Bar(this);
    }
}

使用示例:

var foo = new Foo { someString = "Hello World" };
var bar = foo.CreateBar();
Console.WriteLine(bar.ReturnSomething()); // 输出 Hello World

这里可以把Bar的构造函数改为internal,限制只有Foo内部能创建Bar,更符合封装原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:45:06