Erro do compilador CS0236

Um inicializador de campo não pode fazer referência ao campo não estático, método ou 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 a como a inicialização do objeto funciona em C#. Quando um objeto é criado, os inicializadores de campo são processados antes que qualquer código do construtor seja executado. Durante esta fase:

  1. Restrição de dependência de campo: enquanto os inicializadores de campo são processados em ordem lexical dentro de 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 comportamento imprevisível.

  3. Segurança do compilador: Essa restrição evita possíveis erros de tempo de execução e garante um comportamento previsível de construção de objetos.

O compilador deteta esse padrão durante a compilação e relata 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 onde todos os campos têm a garantia de estar disponíveis.

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

  3. Usar valores padrão: inicialize campos com valores literais ou expressões que não façam referência a outros membros da instância.

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

  5. Construtor primário: Usar construtores primários para inicializar o campo público com o valor do campo de instância ou valor dado como argumento do construtor.

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

O CS0236 também pode ser corrigido usando o construtor primário , como mostrado no seguinte exemplo:

public class MyClass
{
    public int i = 5;
    public int j => i;
}

// or
public class MyClass(int i)
{
    public int j => i;
}

Exemplos adicionais

Os exemplos a seguir demonstram diferentes cenários onde 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;
    }
}