Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
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.
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.
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
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.
Use campos estáticos: se o campo referenciado não precisar ser específico da instância, considere torná-lo estático.
Use valores padrão: inicialize campos com valores literais ou expressões que não referenciam outros membros de instância.
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;
}
}