Řešení chyb a upozornění souvisejících s místními funkcemi

Tento článek se zabývá následujícími chybami a upozorněními kompilátoru:

  • CS8108: Argument s dynamickým typem nelze předat parametru `params` „parameter“ místní funkce „method“.
  • CS8112: Místní funkce "metoda" musí deklarovat tělo, protože není označeno jako static extern.
  • CS8321: Místní funkce "metoda" je deklarována, ale nikdy se nepoužívá.
  • CS8421: Statická místní funkce nemůže obsahovat odkaz na proměnnou.
  • CS8422: Statická místní funkce nemůže obsahovat odkaz na tuto nebo základní funkci.

Místní funkce byly přidány v jazyce C# 7.0. Umožňují deklarovat pomocné metody uvnitř jiného členu. Diagnostika v tomto článku se zabývá deklaracemi místních funkcí, voláními, používáním a dodatečnými omezeními zachycení místních static funkcí.

Těla místních funkcí

  • CS8112: Místní funkce "metoda" musí deklarovat tělo, protože není označeno jako static extern.

Deklarace místní funkce musí obsahovat tělo, pokud není místní funkce deklarována jako static extern. Přidejte k místní funkci tělo bloku nebo tělo výrazu. Pokud je implementace poskytována externě, označte místní funkci static extern a ujistěte se, že deklarace dodržuje pravidla pro externí metody.

Parametry a dynamické argumenty

  • CS8108: Argument s dynamickým typem nelze předat parametru parametru "parameter" místní funkce "method".

Volání místní funkce nemůže předat dynamic jako argument parametru params. Převeďte hodnotu na typ prvku nebo typ pole očekávaný parametrem params před voláním. Hodnoty můžete také uložit do explicitně zadaného pole a předat ho do místní funkce.

Nepoužité místní funkce

  • CS8321: Místní funkce "metoda" je deklarována, ale nikdy se nepoužívá.

Kompilátor hlásí toto upozornění, když deklarujete místní funkci, ale nevolá ji žádný dosažitelný kód. Odeberte nepoužívané místní funkce nebo ji zavolejte z nadřazeného člena. Pokud máte v úmyslu použít místní funkci v budoucí změně, ponechte ji mimo zdroj, dokud nebude potřeba.

Statické místní funkce nemůžou zachytit stav

  • CS8421: Statická místní funkce nemůže obsahovat odkaz na proměnnou.
  • CS8422: Statická místní funkce nemůže obsahovat odkaz na tuto nebo základní funkci.

static Místní funkce nemůže zachytávat stav z vnějšího rozsahu. Nemůže odkazovat na uzavření místních proměnných, parametrů, členů instance prostřednictvím thisnebo this samotného. Předejte každou hodnotu, kterou místní funkce potřebuje jako parametr (CS8421, CS8422). Pokud místní funkce potřebuje zachytit proměnné nebo stav instance z okolního oboru platnosti, odeberte modifikátor static.

Následující příklad ukazuje odkazy, které způsobují 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);
    }
}

Pokud chcete opravit CS8422, předejte požadovaná data instance do místní funkce, přesuňte pomocnou rutinu mimo kontext instance nebo odeberte static , když místní funkce musí přistupovat ke stavu instance.