2012-06-11 28 views
7

私は内部変数を持つクラスCを持っています。 Cの変数にアクセスしたいネストされたクラスNを持っています.CもNも静的ではありませんが、Cにはいくつかの静的なメソッドと変数があります。 NからCの非静的変数にアクセスしようとすると、私は派手なアンダーラインと "静的コンテキストで非静的フィールド[fieldname]にアクセスできない"というメッセージが表示されます。ネストされたクラス:静的コンテキストで非静的フィールドにアクセスできません

これは、囲みクラス自体から変数fineにアクセスできるので、ネストされたクラスと何か関係があるようです。

ReSharperは、私は_tスタティックを提案しますが、これはオプションではありません。私はこれにどのように対処しますか?

public sealed partial class C 
{ 
    string _t; 

    class N 
    { 
     void m() 
     { 
      _t = "fie"; // Error occurs here 
     } 
    } 
} 
+1

(http://stackoverflow.com/questions/3155172/inner-class-and-outer-class-in-c-sharp)とHTTP [C#での内部クラスと外部クラス]の可能重複: //stackoverflow.com/questions/2367015/java-inner-classes-in-c-sharp –

答えて

12

これは、Javaではない、とあなたはインナークラスを持っていません。

ネストされたクラスのインスタンスは、コンストラクタ内に参照(別名ハンドル/ポインタ)を格納して関連付けを行わない限り、外部クラスのインスタンスに関連付けられません。

public sealed partial class C 
{ 
    string _t; 

    class N 
    { 
     readonly C outer; 

     public N(C parent) { outer = parent; } 

     void m() 
     { 
      outer._t = "fie"; // Error is gone 
     } 
    } 
} 
+2

O'Reilly "Nutshell"(Albahari&Albahari)の本では、 "ネストされたタイプ...囲むタイプのプライベートメンバーにアクセスできます囲むタイプにアクセスできる他のすべて」 – Sisiutl

+1

@Sisiutl:これはアクセシビリティとは関係ありません。ルール "Nutshell"に言及しているので、私のコードは 'private string _t; 'でも動作します。そのルールがなければ、あなたは 'internal'か' public'のどちらかを必要とします。静的メソッドもプライベートメンバーにアクセスできますが、非静的メンバーを使用する前にインスタンス参照を提供する必要があります。 –