2009-05-28 13 views
10

Non capisco questo errore in C#Che cosa significa "un inizializzatore di campo non può fare riferimento a campi non statici" significa in C#?

CS0236 errore: Un inizializzatore di campo non può fare riferimento il campo non statico, metodo o proprietà 'Prv.DB.getUserName (lungo)'

Per il seguente codice

public class MyDictionary<K, V> 
{ 
    public delegate V NonExistentKey(K k); 
    NonExistentKey nonExistentKey; 

    public MyDictionary(NonExistentKey nonExistentKey_) { } 
} 

class DB 
{ 
    SQLiteConnection connection; 
    SQLiteCommand command; 

    MyDictionary<long, string> usernameDict = new MyDictionary<long, string>(getUserName); 

    string getUserName(long userId) { } 
} 
+2

Pensate a che cosa accadrebbe se il responsabile di MyDictionary invocasse il delegato passato immediatamente. _ Chiamerebbe un metodo su un oggetto il cui costruttore era ancora in esecuzione! _ Potrebbe essere molto brutto. Pertanto, è illegale passare un delegato a un membro di istanza come questo. –

risposta

13

Qualsiasi inizializzatore di oggetti utilizzato all'esterno di un costruttore deve fare riferimento a membri statici, poiché l'istanza non è stata costruita fino all'esecuzione del costruttore, e l'inizializzazione della variabile diretta avviene concettualmente prima dell'esecuzione di qualsiasi costruttore. getUserName è un metodo di istanza, ma l'istanza contenente non è disponibile.

Per risolvere il problema, provare a inserire l'inizializzatore usernameDict in un costruttore.

1

getUserName è un metodo di istanza.
Cambialo in statico, che potrebbe funzionare.

O

Inizializzare il dizionario nel costruttore.

1

Non è possibile eseguire questa operazione perché l'istanza deve essere inizializzata prima di poter accedere alle proprietà della relativa classe. Gli inizializzatori dei campi vengono chiamati prima che la classe sia inizializzata.

Se si desidera inizializzare il campo nomeutenteDict con il valore di ritorno del metodo GetUserName, è necessario farlo all'interno del costruttore o rendere il metodo uno statico.

Problemi correlati