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

C#からのネストされたクラスは、Javaの内部クラスではなく、C++のネストされたクラスに似ています

別のクラス内でクラスを宣言する場合でも、内部クラスは通常のクラスのように機能します。ネストはアクセスと可視性を制御しますが、動作は制御しません。つまり、通常のクラスについて学習したすべてのルールは、ネストされたクラスにも適用されます。

Javaでは、内部クラスには、バインドされた外部クラスのインスタンスを記憶する秘密のthis$0メンバーがあります。

つまり、Java内部クラスは、C#では使用できないシンタックスシュガーです。C#では、手動で行う必要があります。

于 2011-03-22T15:30:47.343 に答える
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 に答える