Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un inicializador de campo no puede hacer referencia al campo, método o propiedad "name" no estáticos.
Los campos de instancia no se pueden usar para inicializar otros campos de instancia fuera de un método.
¿Por qué se produce este error?
El compilador aplica esta restricción debido a cómo funciona la inicialización de objetos en C#. Cuando se crea un objeto, los inicializadores de campo se procesan antes de que se ejecute cualquier código de constructor. Durante esta fase:
Restricción de dependencia de campo: mientras que los inicializadores de campo se procesan en orden léxico dentro de un único archivo, la regla impide que las dependencias entre campos permitan a los autores de clases reorganizar los campos sin introducir errores del compilador. En el caso de las clases parciales, no se especifica el orden de inicializadores de campo entre archivos de origen diferentes.
El objeto no se construye completamente: cuando se ejecutan inicializadores de campo, la instancia del objeto está en un estado incompleto. Permitir referencias entre campos durante esta fase podría provocar el acceso a la memoria no inicializada o al comportamiento impredecible.
Seguridad del compilador: esta restricción evita posibles errores en tiempo de ejecución y garantiza un comportamiento predecible de la construcción de objetos.
El compilador detecta este patrón durante la compilación e informa de CS0236 para evitar estos posibles problemas.
Para corregir este error
Mover la inicialización al constructor: realice la inicialización dentro de un constructor de instancia donde se garantiza que todos los campos estén disponibles.
Usar campos estáticos: si el campo al que se hace referencia no necesita ser específico de la instancia, considere la posibilidad de que sea estático.
Usar valores predeterminados: inicialice campos con valores literales o expresiones que no hagan referencia a otros miembros de instancia.
Inicialización diferida: use propiedades con campos de respaldo para una lógica de inicialización compleja que dependa de otros miembros de instancia.
Constructor principal: use constructores principales para inicializar el campo público con el valor de campo de instancia o valor especificado como argumento constructor.
Ejemplo
El ejemplo siguiente genera la advertencia CS0236 y muestra cómo corregirlo:
public class MyClass
{
public int i = 5;
// CS0236: Field initializer cannot reference instance field 'i'
// This restriction allows class authors to rearrange fields without compiler errors
public int j = i; // CS0236
public MyClass()
{
// This works because both fields are guaranteed to be initialized
// before constructor code runs
j = i;
}
}
CS0236 también se puede corregir mediante el constructor principal , como se muestra en el ejemplo siguiente:
public class MyClass
{
public int i = 5;
public int j => i;
}
// or
public class MyClass(int i)
{
public int j => i;
}
Ejemplos adicionales
En los ejemplos siguientes se muestran diferentes escenarios en los que se produce el error CS0236:
public class Examples
{
private string name = "Default";
// CS0236: Cannot reference instance field in initializer
private string displayName = name.ToUpper();
// CS0236: Cannot reference instance method in initializer
private int length = GetNameLength();
// CS0236: Cannot reference instance property in initializer
private string formatted = FormattedName;
public string FormattedName => $"Name: {name}";
private int GetNameLength() => name.Length;
public Examples()
{
// All of these work in the constructor:
displayName = name.ToUpper();
length = GetNameLength();
formatted = FormattedName;
}
}