... dà questo errore "Un inizializzatore campo non può fare riferimento il campo non statico, metodo o proprietà".
Leggere più attentamente il messaggio di errore. Ti sta dicendo esattamente cosa c'è che non va. Un inizializzatore di campo non può fare riferimento a un metodo non statico . Questo perché il compilatore sta cercando di proteggere l'utente da questo bug:
class C
{
int foo;
int bar = GetBar();
public C(int newFoo)
{
this.foo = newFoo;
}
private int GetBar() { return this.foo + 1; }
}
Fate "nuova C (123)". A cosa serve la barra? Se questo fosse codice legale, sarebbe impostato su 1, non su 124. Perché?Poiché first foo viene inizializzato a zero, viene chiamato GetBar(), quindi il corpo del costruttore imposta this.foo a 123.
Per evitare questo bug è semplicemente illegale fare riferimento a un metodo o campo di istanza in un inizializzatore di campo.
Ora, si potrebbe ragionevolmente sottolineare che nel codice, non lo fai uso il metodo di istanza, è solo riferimento esso. In realtà non è mai chiamare it. Questo in realtà è sicuro. Tuttavia, le regole di C# sono progettate per essere semplici e prudenti; anche se potremmo dimostrare che questo caso è sicuro, prendiamo la strada semplice e prudente e diciamo che il numero del riferimento all'istanza in un inizializzatore di campo è illegale.
Se cambio il metodo in statico, funziona.
Corretto. In tal caso, il metodo non dipende dallo stato dell'istanza che non è stato ancora impostato.
Ma io non voglio.
OK, allora la vostra unica altra scelta è quella di fermata utilizzando un campo di inizializzazione. Metti l'inizializzazione nel costruttore; quindi si assume la responsabilità di garantire che l'inizializzazione non utilizzi accidentalmente lo stato non inizializzato.
fonte
2010-12-10 18:30:50
mostrami il codice per favore. – Seva
hai solo bisogno di un riferimento all'oggetto per drawFloorAround(); – phillip
@philip: No, non funziona neanche; se l'oggetto è "questo", che sembra essere destinato a essere, allora si verificherà lo stesso errore. * Non è possibile fare riferimento a "questo" in un inizializzatore di campo. * –