Condividi tramite


Errore del compilatore CS0236

Un inizializzatore di campo non può fare riferimento al campo, al metodo o alla proprietà non statica 'name'.

Non è possibile utilizzare campi di istanza per inizializzare altri campi di istanza all'esterno di un metodo.

Perché si verifica questo errore

Il compilatore applica questa restrizione a causa del funzionamento dell'inizializzazione degli oggetti in C#. Quando viene creato un oggetto, gli inizializzatori di campo vengono elaborati prima dell'esecuzione di qualsiasi codice del costruttore. Durante questa fase:

  1. Restrizione delle dipendenze dei campi: mentre gli inizializzatori di campo vengono elaborati in ordine lessicale all'interno di un singolo file, la regola impedisce le dipendenze tra i campi per consentire agli autori di classi di riorganizzare i campi senza introdurre errori del compilatore. Per le classi parziali, l'ordine degli inizializzatori di campo in file di origine diversi non viene specificato.

  2. L'oggetto non è completamente costruito: quando vengono eseguiti gli inizializzatori di campo, l'istanza dell'oggetto è in uno stato incompleto. Consentire riferimenti tra campi durante questa fase potrebbe causare l'accesso alla memoria non inizializzata o a un comportamento imprevedibile.

  3. Sicurezza del compilatore: questa restrizione impedisce potenziali errori di runtime e garantisce un comportamento prevedibile della costruzione di oggetti.

Il compilatore rileva questo modello durante la compilazione e segnala CS0236 per evitare questi potenziali problemi.

Per correggere l'errore

  1. Spostare l'inizializzazione nel costruttore: eseguire l'inizializzazione all'interno di un costruttore di istanza in cui tutti i campi sono sicuramente disponibili.

  2. Usare campi statici: se il campo a cui si fa riferimento non deve essere specifico dell'istanza, è consigliabile renderlo statico.

  3. Usare i valori predefiniti: inizializzare i campi con valori letterali o espressioni che non fanno riferimento ad altri membri dell'istanza.

  4. Inizializzazione differita: usare le proprietà con campi di supporto per logica di inizializzazione complessa che dipende da altri membri dell'istanza.

Esempio

L'esempio seguente genera l'errore CS0236 e mostra come risolverlo:

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

Esempi aggiuntivi

Gli esempi seguenti illustrano diversi scenari in cui si verifica 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;
    }
}