嵌套类访问外部类非静态字段遇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
相关产品推荐
相关产品推荐

