7

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

class Test
{
   private int abc = 0;

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

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

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

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

有没有其他解决方案?

4

4 回答 4

15

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

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

于 2011-03-22T15:19:04.010 回答
9

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

class Test
{
   private int abc = 0;

   public class TestClass
   {
      private void changeABC(Test test)
      {
         test.abc = 123;
      }
   }
}
于 2011-03-22T15:18:57.957 回答
1

我不明白为什么当它是一个实例类时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();
于 2011-03-22T15:23:52.257 回答
1

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

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

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

换句话说,Java 内部类是 C# 不可用的语法糖。在 C# 中,您必须手动完成。

于 2011-03-22T15:30:47.343 回答