Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
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.
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.
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
Spostare l'inizializzazione nel costruttore: eseguire l'inizializzazione all'interno di un costruttore di istanza in cui tutti i campi sono sicuramente disponibili.
Usare campi statici: se il campo a cui si fa riferimento non deve essere specifico dell'istanza, è consigliabile renderlo statico.
Usare i valori predefiniti: inizializzare i campi con valori letterali o espressioni che non fanno riferimento ad altri membri dell'istanza.
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;
}
}