2012-06-11 10 views
7

Tengo una clase C con algunas variables internas. Tiene una clase anidada N que quiere acceder a las variables en C. Ni C ni N son estáticas, aunque C tiene algunos métodos y variables estáticos. Cuando trato de acceder a una variable no estática en C desde N, obtengo el subrayado ondulado y el mensaje "No se puede acceder al campo no estático [fieldname] en contexto estático".Clase anidada: no se puede acceder al campo no estático en el contexto estático

Esto parece tener algo que ver con la clase anidada, ya que puedo acceder a la variable fina desde la propia clase adjunta.

ReSharper sugiere que haga _t estático, pero eso no es una opción. ¿Cómo trato con esto?

public sealed partial class C 
{ 
    string _t; 

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

posible duplicado de [clase interna y clase exterior en C#] (http://stackoverflow.com/questions/3155172/inner-class-and-outer-class-in-c-sharp) y http: //stackoverflow.com/questions/2367015/java-inner-classes-in-c-sharp –

Respuesta

12

Esto no es Java, y que no tienen interiores clases.

Una instancia de una clase anidada no está asociada con ninguna instancia de la clase externa, a menos que haga una asociación almacenando una referencia (también conocido como handle/puntero) dentro del constructor.

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

El libro O'Reilly "Nutshell" (Albahari & Albahari) dice "Un tipo anidado ... puede acceder a los miembros privados del tipo adjunto y todo lo demás al que puede acceder el tipo adjunto ". – Sisiutl

+1

@Sisiutl: Esto no tiene nada que ver con la accesibilidad. Debido a la regla que menciona "Nutshell", mi código funciona incluso con 'private string _t;'. Sin esa regla, necesitaría 'interno' o' público'. Un método estático también tiene acceso a miembros privados, pero necesita proporcionar una referencia de instancia antes de usar miembros no estáticos. –

Cuestiones relacionadas