嵌套类型问题

我只是试图创建这个简单的实现:

class Test { private int abc = 0; public class TestClass { private void changeABC() { abc = 123; } } } 

如果我编译它,它会抱怨:

无法通过嵌套类型“B.Test.TestClass”访问外部类型“A.Test”的非静态成员

我不喜欢设置的解决方案: static int abc = 0;

还有其他解决方案吗?

您可能来自Java背景,此代码可以按预期工作。

在C#中,嵌套类型是静态的 (用Java的说法),即它们不绑定到父类的实例。 这就是您的代码失败的原因。 您需要以某种方式将父类的实例传递给子类并访问成员abc

内部类需要引用外部类的实例:

 class Test { private int abc = 0; public class TestClass { private void changeABC(Test test) { test.abc = 123; } } } 

我不明白为什么TestClass 应该在它的实例类时更改父Test

也许我的例子可以阐明这一点:

 class Test { public Test() { TestClass test = new TestClass();//create a new **instance** here test.changeABC(this);//give the instance of Test to TestClass Console.WriteLine(abc);//will print 123 } int abc = 0; public class TestClass { public void changeABC(Test t) { t.abc = 123; } } } 

使用像这样:

 Test theTest = new Test(); 

从C#嵌套类就像C ++嵌套类,而不是Java内部类

当您在另一个类中声明一个类时,内部类仍然像常规类一样。 嵌套控制访问和可见性,但不控制行为。 换句话说,您学习的关于常规类的所有规则也适用于嵌套类。

在Java中,内部类有一个秘密这个$ 0成员,它记住它绑定的外部类的实例。

换句话说,Java内部类是C#无法使用的语法糖。 在C#中,您必须手动执行此操作。