无法通过嵌套类型访问外部类型的非静态成员

时间:2013-05-01 15:17:24

标签: c# class

我有错误

  

无法通过访问外部类型“Project.Neuro”的非静态成员   嵌套类型'Project.Neuro.Net'

使用这样的代码(简化):

class Neuro
{
    public class Net
    {
        public void SomeMethod()
        {
            int x = OtherMethod(); // error is here
        }
    }

    public int OtherMethod() // its outside Neuro.Net class
    {
        return 123;  
    }
}

我可以将有问题的方法移到Neuro.Net类,但我需要在外面使用这个方法。

我是一种客观的编程新手。

提前致谢。

4 个答案:

答案 0 :(得分:20)

问题是嵌套类不是派生的类,因此外部类中的方法不是继承的

有些选项

  1. 制作方法static

    class Neuro
    {
        public class Net
        {
            public void SomeMethod()
            {
                int x = Neuro.OtherMethod(); 
            }
        }
    
        public static int OtherMethod() 
        {
            return 123;  
        }
    }
    
  2. 使用继承而不是嵌套类:

    public class Neuro  // Neuro has to be public in order to have a public class inherit from it.
    {
        public static int OtherMethod() 
        {
            return 123;  
        }
    }
    
    public class Net : Neuro
    {
        public void SomeMethod()
        {
            int x = OtherMethod(); 
        }
    }
    
  3. 创建Neuro的实例:

    class Neuro
    {
        public class Net
        {
            public void SomeMethod()
            {
                Neuro n = new Neuro();
                int x = n.OtherMethod(); 
            }
        }
    
        public int OtherMethod() 
        {
            return 123;  
        }
    }
    

答案 1 :(得分:2)

您需要在代码中的某处实例化Neuro类型的对象,并在其上调用OtherMethod,因为OtherMethod不是静态方法。是否在SomeMethod内创建此对象,或将其作为参数传递给它取决于您。类似的东西:

// somewhere in the code
var neuroObject = new Neuro();

// inside SomeMethod()
int x = neuroObject.OtherMethod();

或者,您可以将OtherMethod设为静态,这样您就可以像现在这样从SomeMethod拨打电话。

答案 2 :(得分:0)

即使类嵌套在另一个类中,但是外部类的哪个实例与哪个内部类实例进行对话仍然不明显。我可以创建一个内部类的实例,并将其传递给外部类的另一个实例。 因此,您需要特定的实例来调用此OtherMethod()

您可以在创建时传递实例:

class Neuro
{
    public class Net
    {
        private Neuro _parent;
        public Net(Neuro parent)
        {
         _parent = parent;
        }
        public void SomeMethod()
        {
            _parent.OtherMethod(); 
        }
    }

    public int OtherMethod() 
    {
        return 123;  
    }
}

答案 3 :(得分:0)

我认为在内部类中创建外部类的实例不是一个好的选择,因为您可以在外部类构造函数上执行业务逻辑。制作静态方法或属性是更好的选择。如果你坚持创建一个外部类的实例,那么你应该向外部类构造函数添加另一个不执行业务逻辑的参数。