嵌套类访问外部类非静态成员函数报错的问题咨询
嵌套类访问外部类非静态成员函数报错的问题咨询
你遇到的这个报错其实很常见,核心原因是:嵌套类虽然定义在外部类内部,但它并不会自动持有外部类的实例引用,而非静态方法(比如你写的NamesAsList())是属于外部类实例的,不是类本身,所以在嵌套类里直接调用的话,编译器根本不知道该用哪个外部类的实例来执行这个方法。
给你两种针对性的解决方案,你可以根据自己的实际需求选择:
方案一:如果方法不需要依赖外部类实例状态,改成静态方法
如果NamesAsList()的逻辑不需要用到外部类Class1的任何实例成员(比如没有访问Class1里的非静态字段、属性),那直接把这个方法改成静态的就行,这样就能在嵌套类里通过外部类名直接调用:
public class Class1 { public class Class2 { public string[] Names { get { // 直接用外部类名调用静态方法 return Class1.NamesAsList().ToArray(); } } } // 改成静态方法 public static List<string> NamesAsList() { // 这里的实现不能依赖Class1的非静态成员 return new List<string> { "Alice", "Bob", "Charlie" }; } }
方案二:如果方法依赖外部类实例状态,给嵌套类传入外部类实例
如果NamesAsList()必须用到Class1的实例数据(比如外部类有非静态的字段、属性需要访问),那你需要在嵌套类Class2里保存一个外部类Class1的实例引用,通常可以通过构造函数传入:
public class Class1 { // 假设外部类有实例成员 private string _instanceSpecificValue; public Class1(string value) { _instanceSpecificValue = value; } public class Class2 { // 持有外部类的实例引用 private readonly Class1 _parentInstance; // 构造函数接收外部类实例 public Class2(Class1 parent) { _parentInstance = parent ?? throw new ArgumentNullException(nameof(parent)); } public string[] Names { get { // 用持有的实例调用非静态方法 return _parentInstance.NamesAsList().ToArray(); } } } public List<string> NamesAsList() { // 这里可以访问外部类的实例成员 return new List<string> { _instanceSpecificValue, "David", "Eve" }; } }
使用的时候,要先创建Class1的实例,再传入Class2的构造:
var parent = new Class1("MyCustomValue"); var nested = new Class1.Class2(parent); string[] names = nested.Names;
简单总结下:嵌套类和外部类的非静态成员是相互独立的,要么把方法改成静态摆脱实例依赖,要么给嵌套类关联一个外部类的实例,这样才能调用非静态方法~
内容来源于stack exchange
相关产品推荐
相关产品推荐

