Beheben von Fehlern und Warnungen im Zusammenhang mit lokalen Funktionen

Dieser Artikel behandelt die folgenden Compiler-Fehler und -Warnungen:

  • CS8108: Argument mit dynamischem Typ kann nicht an den Parameter 'parameter' der lokalen Funktion 'method' übergeben werden.
  • CS8112: Die lokale Funktion "methode" muss einen Text deklarieren, da sie nicht als "statisch extern" gekennzeichnet ist.
  • CS8321: Die lokale Funktion "method" wird deklariert, aber nie verwendet.
  • CS8421: Eine statische lokale Funktion kann keinen Verweis auf "Variable" enthalten.
  • CS8422: Eine statische lokale Funktion kann keinen Verweis auf "this" oder "base" enthalten.

Lokale Funktionen wurden in C# 7.0 hinzugefügt. Sie können Hilfsmethoden innerhalb eines anderen Members deklarieren. Die Diagnose in diesem Artikel behandelt lokale Funktionsdeklarationen, Aufrufe, Verwendung und die zusätzlichen Erfassungseinschränkungen für static lokale Funktionen.

Lokale Funktionskörper

  • CS8112: Die lokale Funktion "methode" muss einen Text deklarieren, da sie nicht als "statisch extern" gekennzeichnet ist.

Eine lokale Funktionsdeklaration muss einen Text enthalten, es sei denn, die lokale Funktion wird als static extern deklariert. Fügen Sie der lokalen Funktion einen Blockkörper oder einen Ausdruckskörper hinzu. Wenn die Implementierung extern bereitgestellt wird, markieren Sie die lokale Funktion static extern , und stellen Sie sicher, dass die Deklaration den Regeln für externe Methoden folgt.

Parameter und dynamische Argumente

  • CS8108: Argument mit dynamischem Typ kann nicht an den Parameter 'parameter' der lokalen Funktion 'method' übergeben werden.

Ein lokaler Funktionsaufruf kann kein dynamic Argument an einen params Parameter übergeben. Konvertieren Sie den Wert in den Vom Parameter erwarteten params Elementtyp oder Arraytyp vor dem Aufruf. Sie können die Werte auch in einem explizit typierten Array speichern und dieses Array an die lokale Funktion übergeben.

Nicht verwendete lokale Funktionen

  • CS8321: Die lokale Funktion "method" wird deklariert, aber nie verwendet.

Der Compiler meldet diese Warnung, wenn Sie eine lokale Funktion deklarieren, aber kein erreichbarer Code sie aufruft. Entfernen Sie die nicht verwendete lokale Funktion, oder rufen Sie sie aus dem eingeschlossenen Element auf. Wenn Sie planen, die lokale Funktion in einer späteren Änderung zu verwenden, nehmen Sie sie erst in den Quellcode auf, wenn sie benötigt wird.

Statische lokale Funktionen können den Zustand nicht erfassen

  • CS8421: Eine statische lokale Funktion kann keinen Verweis auf "Variable" enthalten.
  • CS8422: Eine statische lokale Funktion kann keinen Verweis auf "this" oder "base" enthalten.

Eine static lokale Funktion kann den Zustand nicht aus dem eingeschlossenen Bereich erfassen. Sie kann nicht auf umschließende lokale Variablen, Parameter oder Instanzmitglieder über this bzw. auf this selbst verweisen. Übergeben Sie jeden Wert, den die lokale Funktion als Parameter benötigt (CS8421, CS8422). Wenn die lokale Funktion Variablen oder den Instanzstatus aus dem eingeschlossenen Bereich erfassen muss, entfernen Sie den static Modifizierer.

Das folgende Beispiel zeigt Referenzen, die zu CS8422 führen:

public class C
{
    private int counter = 1;

    public void IncreaseCounter()
    {
        static void LocalFunc(int addition)
        {
            this.counter += addition;   // CS8422
            base.ToString();            // CS8422

            counter += addition;        // CS8422: implicit this
            ToString();                 // CS8422: implicit base
        }

        LocalFunc(10);
    }
}

Um CS8422 zu beheben, übergeben Sie die erforderlichen Instanzdaten an die lokale Funktion, verschieben Sie das Hilfsprogramm außerhalb des Instanzkontexts, oder entfernen static Sie, wenn die lokale Funktion auf den Instanzstatus zugreifen muss.