2009-05-28 52 views
10

No entiendo este error en C#¿Qué significa "un inicializador de campo no puede hacer referencia a campos no estáticos" significa en C#?

CS0236 de error: Un inicializador de campo no puede hacer referencia al campo no estático, método o propiedad 'Prv.DB.getUserName (largo)'

Para obtener el siguiente código

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

Piense en lo sucedería si el cdigo de MyDictionary invoca el delegado pasado inmediatamente. ¡Llamaría a un método en un objeto cuyo constructor aún se estaba ejecutando! _ Eso podría ser muy malo. Por lo tanto, es ilegal pasar un delegado a un miembro de instancia como este. –

Respuesta

13

Cualquier inicializador de objetos utilizado fuera de un constructor tiene que referirse a miembros estáticos, ya que la instancia no se ha construido hasta que se ejecuta el constructor y la inicialización de variables directas ocurre conceptualmente antes de ejecutar cualquier constructor. getUserName es un método de instancia, pero la instancia que lo contiene no está disponible.

Para solucionarlo, intente poner el inicializador usernameDict dentro de un constructor.

1

getUserName es un método de instancia.
Cambie a estático, eso podría funcionar.

O

inicializar el diccionario en el constructor.

1

No puede hacer esto porque la instancia debe inicializarse para poder acceder a las propiedades de su clase. Los inicializadores de campo se invocan antes de que la clase se inicialice.

Si desea inicializar el campo usernameDict con el valor de retorno de GetUserName-Method, debe hacerlo dentro del constructor o hacer que el Método sea estático.

Cuestiones relacionadas