Usuwanie błędów i ostrzeżeń związanych z funkcjami lokalnymi

W tym artykule opisano następujące błędy i ostrzeżenia kompilatora:

  • CS8108: Nie można przekazać argumentu o typie dynamicznym do parametru params „parameter” funkcji lokalnej „method”.
  • CS8112: Funkcja lokalna „method” musi zawierać treść, ponieważ nie jest oznaczona jako „static extern”.
  • CS8321: funkcja lokalna "method" jest zadeklarowana, ale nigdy nie jest używana
  • CS8421: Statyczna funkcja lokalna nie może zawierać odwołania do zmiennej.
  • CS8422: Statyczna funkcja lokalna nie może zawierać odwołania do "this" lub "base".

Funkcje lokalne zostały dodane w języku C# 7.0. Umożliwiają deklarowanie metod pomocniczych wewnątrz innej składowej. Diagnostyki omówione w tym artykule obejmują deklaracje funkcji lokalnych, wywołania, ich użycie oraz dodatkowe ograniczenia dotyczące przechwytywania dla funkcji lokalnych static.

Lokalne jednostki funkcji

  • CS8112: Funkcja lokalna "method" musi zadeklarować treść, ponieważ nie jest oznaczona jako "statyczny extern".

Deklaracja funkcji lokalnej musi zawierać treść, chyba że funkcja lokalna jest zadeklarowana static extern. Dodaj treść bloku lub treść wyrażenia do funkcji lokalnej. Jeśli implementacja jest dostarczana zewnętrznie, oznacz funkcję static extern lokalną i upewnij się, że deklaracja jest zgodna z regułami metod zewnętrznych.

Parametry parametrów i argumenty dynamiczne

  • CS8108: Nie można przekazać argumentu o typie dynamicznym do parametru `params` 'parameter' funkcji lokalnej 'method'.

Wywołanie funkcji lokalnej nie może przekazać argumentu dynamic do parametru params . Przekonwertuj wartość na typ elementu lub typ tablicy oczekiwany przez parametr params przed wywołaniem. Można również przechowywać wartości w jawnie wpisanej tablicy i przekazywać tę tablicę do funkcji lokalnej.

Nieużywane funkcje lokalne

  • CS8321: funkcja lokalna "method" jest zadeklarowana, ale nigdy nie jest używana

Kompilator zgłasza to ostrzeżenie podczas deklarowania funkcji lokalnej, ale nie można wywołać go w kodzie dostępnym. Usuń nieużywaną funkcję lokalną lub wywołaj ją z elementu zawierającego. Jeśli zamierzasz użyć funkcji lokalnej w przyszłej zmianie, zachowaj ją poza źródłem, dopóki nie będzie potrzebna.

Statyczne funkcje lokalne nie mogą przechwytywać stanu

  • CS8421: Statyczna funkcja lokalna nie może zawierać odwołania do zmiennej.
  • CS8422: Statyczna funkcja lokalna nie może zawierać odwołania do "this" lub "base".

Funkcja lokalnastatic nie może przechwytywać stanu z otaczającego zakresu. Nie może odwoływać się do lokalnych zmiennych zakresu zewnętrznego, parametrów ani składowych wystąpienia za pośrednictwem this ani samego this. Przekaż każdą wartość, która wymaga funkcji lokalnej jako parametru (CS8421, CS8422). Jeśli funkcja lokalna musi przechwytywać zmienne lub stan instancji z otaczającego zakresu, usuń modyfikator static.

W poniższym przykładzie przedstawiono odwołania, które wywołują CS8422:

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

Aby naprawić cs8422, przekaż wymagane dane wystąpienia do funkcji lokalnej, przenieś pomocnika poza kontekst wystąpienia lub usuń static , gdy funkcja lokalna musi uzyskać dostęp do stanu wystąpienia.