Fouten en waarschuwingen met betrekking tot lokale functies oplossen

In dit artikel worden de volgende compilerfouten en -waarschuwingen behandeld:

  • CS8108: Kan argument met dynamisch type niet doorgeven aan parameter 'parameter' van de lokale functie 'method'.
  • CS8112: Lokale functie 'methode' moet een hoofdtekst declareren omdat deze niet is gemarkeerd als 'statisch extern'.
  • CS8321: De lokale functie 'methode' wordt gedeclareerd maar nooit gebruikt
  • CS8421: Een statische lokale functie kan geen verwijzing naar 'variabele' bevatten.
  • CS8422: Een statische lokale functie kan geen verwijzing naar 'this' of 'base' bevatten.

Lokale functies zijn toegevoegd in C# 7.0. Hiermee kunt u helpermethoden binnen een ander lid declareren. De diagnostische gegevens in dit artikel hebben betrekking op declaraties van lokale functies, aanroepen, gebruik en de extra opnamebeperkingen voor static lokale functies.

Functieblokken van lokale functies

  • CS8112: Lokale functie 'methode' moet een hoofdtekst declareren omdat deze niet is gemarkeerd als 'statisch extern'.

Een declaratie van een lokale functie moet een hoofdtekst bevatten, tenzij de lokale functie wordt gedeclareerd static extern. Voeg een bloktekst of een expressietekst toe aan de lokale functie. Als de implementatie extern wordt geleverd, markeert u de lokale functie static extern en zorgt u ervoor dat de declaratie de regels voor externe methoden volgt.

Params-parameters en dynamische argumenten

  • CS8108: Kan argument met dynamisch type niet doorgeven aan parameter 'parameter' van de lokale functie 'method'.

Een lokale functie-aanroep kan geen argument doorgeven dynamic aan een params parameter. Converteer de waarde naar het elementtype of het matrixtype dat wordt verwacht door de params parameter vóór de aanroep. U kunt de waarden ook opslaan in een expliciet getypte matrix en die matrix doorgeven aan de lokale functie.

Ongebruikte lokale functies

  • CS8321: De lokale functie 'methode' wordt gedeclareerd maar nooit gebruikt

De compiler meldt deze waarschuwing wanneer u een lokale functie declareert, maar geen enkele bereikbare code deze aanroept. Verwijder de ongebruikte lokale functie of roep deze aan vanuit het omsluitende lid. Als u de lokale functie in een toekomstige wijziging wilt gebruiken, moet u deze uit de bron houden totdat deze nodig is.

Statische lokale functies kunnen de status niet vastleggen

  • CS8421: Een statische lokale functie kan geen verwijzing naar 'variabele' bevatten.
  • CS8422: Een statische lokale functie kan geen verwijzing naar 'this' of 'base' bevatten.

Een static lokale functie kan geen toestand uit de omliggende scope vastleggen. Er kan niet worden verwezen naar omsluitende lokale variabelen, parameters of instantieleden via this of this zelf. Geef elke waarde door die de lokale functie nodig heeft als een parameter (CS8421, CS8422). Als de lokale functie variabelen of instantiegegevens uit de omvattende scope moet vastleggen, verwijdert u de modifier static.

In het volgende voorbeeld ziet u verwijzingen die cs8422 veroorzaken:

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

Als u CS8422 wilt herstellen, geeft u de vereiste exemplaargegevens door aan de lokale functie, verplaatst u de helper buiten de instantiecontext of verwijdert static u deze wanneer de lokale functie toegang moet hebben tot de status van het exemplaar.