2012-06-11 9 views
7

Ho una classe C con alcune variabili interne. Ha una classe n annidata che vuole accedere alle variabili in C. Né C né N sono statici, sebbene C abbia alcuni metodi e variabili statici. Quando provo ad accedere a una variabile non statica in C da N, viene visualizzata la sottolineatura ondulata e il messaggio "Impossibile accedere al campo non statico [nome campo] nel contesto statico".Classe nidificata: impossibile accedere al campo non statico nel contesto statico

Questo sembra avere qualcosa a che fare con la classe nidificata, dal momento che posso accedere alla variabile fine dalla classe che lo racchiude.

ReSharper suggerisce di rendere statico, ma non è un'opzione. Come gestisco questo?

public sealed partial class C 
{ 
    string _t; 

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

possibile duplicato del [classe interna e la classe esterno in C#] (http://stackoverflow.com/questions/3155172/inner-class-and-outer-class-in-c-sharp) e http: //stackoverflow.com/questions/2367015/java-inner-classes-in-c-sharp –

risposta

12

Questo non è Java, e non si hanno interne classi.

Un'istanza di una classe nidificata non è associata a nessuna istanza della classe esterna, a meno che non si effettui un'associazione memorizzando un riferimento (ovvero handle/puntatore) all'interno del costruttore.

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

Il libro O'Reilly "Nutshell" (Albahari & Albahari) dice "Un tipo annidato ... può accedere ai membri privati ​​del tipo che li include e tutto il resto può accedere al tipo che lo include. " – Sisiutl

+1

@Sisiutl: questo non ha nulla a che fare con l'accessibilità. A causa della regola "Nutshell" menziona, il mio codice funziona anche con 'private string _t;'. Senza questa regola, avresti bisogno di 'internal' o' public'. Un metodo statico ha anche accesso ai membri privati, ma deve fornire un riferimento di istanza prima di utilizzare membri non statici. –