Freigeben über


Compilerfehler CS0236

Ein Feldinitialisierer kann nicht auf das nicht statische Feld, die Methode oder den Eigenschaftennamen verweisen.

Instanzfelder können nicht verwendet werden, um andere Instanzfelder außerhalb einer Methode zu initialisieren.

Warum dieser Fehler auftritt

Der Compiler erzwingt diese Einschränkung aufgrund der Funktionsweise der Objektinitialisierung in C#. Wenn ein Objekt erstellt wird, werden Feldinitialisierer verarbeitet, bevor Konstruktorcode ausgeführt wird. In dieser Phase:

  1. Einschränkung der Feldabhängigkeit: Während Feldinitialisierer in lexikalischer Reihenfolge innerhalb einer einzelnen Datei verarbeitet werden, verhindert die Regel Abhängigkeiten zwischen Feldern, um Klassenautoren das Neuanordnen von Feldern ohne Compilerfehler zu ermöglichen. Bei partiellen Klassen wird die Reihenfolge der Feldinitialisierer für verschiedene Quelldateien nicht angegeben.

  2. Objekt ist nicht vollständig konstruiert: Wenn Feldinitialisierer ausgeführt werden, befindet sich die Objektinstanz in einem unvollständigen Zustand. Das Zulassen von Verweisen zwischen Feldern in dieser Phase kann zu einem Zugriff auf nicht initialisiertem Speicher oder zu unvorhersehbaren Verhaltensweisen führen.

  3. Compilersicherheit: Diese Einschränkung verhindert potenzielle Laufzeitfehler und stellt ein vorhersagbares Objektkonstruktionsverhalten sicher.

Der Compiler erkennt dieses Muster während der Kompilierung und meldet CS0236, um diese potenziellen Probleme zu verhindern.

So beheben Sie diesen Fehler

  1. Initialisierung in Konstruktor verschieben: Führen Sie die Initialisierung innerhalb eines Instanzkonstruktors durch, in dem alle Felder garantiert verfügbar sind.

  2. Verwenden Sie statische Felder: Wenn das referenzierte Feld nicht instanzspezifisch sein muss, erwägen Sie, es statisch zu machen.

  3. Verwenden Sie Standardwerte: Initialisieren Sie Felder mit Literalwerten oder Ausdrücken, die nicht auf andere Instanzmelemente verweisen.

  4. Lazy initialization: Verwenden Sie Eigenschaften mit Sicherungsfeldern für komplexe Initialisierungslogik, die von anderen Instanzmitgliedern abhängt.

Beispiel

Im folgenden Beispiel wird CS0236 generiert und gezeigt, wie Sie diesen Fehler beheben:

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

Weitere Beispiele

Die folgenden Beispiele veranschaulichen unterschiedliche Szenarien, in denen CS0236 auftritt:

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