Compartilhar via


Erro do compilador CS0236

Um inicializador de campo não pode referenciar o campo não estático, o método ou a propriedade 'name'.

Os campos de instância não podem ser usados para inicializar outros campos de instância fora de um método.

Por que esse erro ocorre

O compilador impõe essa restrição devido à forma como a inicialização do objeto funciona em C#. Quando um objeto é criado, os inicializadores de campo são processados antes de qualquer código de construtor ser executado. Durante esta fase:

  1. Restrição de dependência de campo: embora os inicializadores de campo sejam processados em ordem lexical em um único arquivo, a regra impede dependências entre campos para permitir que os autores de classe reorganizem campos sem introduzir erros do compilador. Para classes parciais, a ordem dos inicializadores de campo em diferentes arquivos de origem não é especificada.

  2. O objeto não é totalmente construído: quando os inicializadores de campo são executados, a instância do objeto está em um estado incompleto. Permitir referências entre campos durante essa fase pode levar ao acesso à memória não inicializada ou ao comportamento imprevisível.

  3. Segurança do compilador: essa restrição impede possíveis erros de runtime e garante um comportamento previsível de construção de objeto.

O compilador detecta esse padrão durante a compilação e relata o CS0236 para evitar esses possíveis problemas.

Para corrigir este erro

  1. Mover a inicialização para o construtor: execute a inicialização dentro de um construtor de instância em que todos os campos estejam disponíveis.

  2. Use campos estáticos: se o campo referenciado não precisar ser específico da instância, considere torná-lo estático.

  3. Use valores padrão: inicialize campos com valores literais ou expressões que não referenciam outros membros de instância.

  4. Inicialização lenta: use propriedades com campos de backup para lógica de inicialização complexa que depende de outros membros da instância.

Exemplo

O exemplo a seguir gera CS0236 e mostra como corrigi-lo:

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;
    }
}

Mais exemplos

Os exemplos a seguir demonstram cenários diferentes em que o CS0236 ocorre:

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;
    }
}