嵌套类型问题
我只是试图创建这个简单的实现:
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#中,您必须手动执行此操作。