Řešení chyb a upozornění pro delegáty a funkční ukazatele

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

  • CS0059: Nekonzistentní přístupnost: typ parametru 'type' je méně přístupný než delegát 'delegate'.
  • CS0123: Žádné přetížení metody neodpovídá delegátu "delegate".
  • CS0148: Delegát 'delegate' nemá platný konstruktor.
  • CS0410: Žádné přetížení pro 'metoda' nemá správný parametr a návratový typ.
  • CS0644: 'class' nemůže odvodit ze speciální třídy 'class'.
  • CS1599: Návratový typ metody, delegáta nebo ukazatele funkce nemůže být type.
  • CS1958: Výrazy inicializátoru objektů a kolekcí nelze použít pro výraz vytvoření delegáta.
  • CS8755: Modifikátor nelze použít jako modifikátor parametru ukazatele funkce.
  • CS8756: Ukazatel funkce 'type' nepřebírá 'count' argumentů.
  • CS8757: Žádné přetížení metody neodpovídá ukazateli funkce "type".
  • CS8758: Neshoda ref mezi metodou a ukazatelem funkce type.
  • CS8759: Nelze vytvořit ukazatel funkce pro metodu, protože není statickou metodou.
  • CS8786: Volací konvence 'convention' není kompatibilní s 'convention'.
  • CS8787: Nelze převést skupinu metod na ukazatel funkce. (Chybí vám '&'?)
  • CS8788: Nelze použít metodu rozšíření s příjemcem jako cíl operátoru &.
  • CS8789: Typ místního deklarovaného v pevném příkazu nemůže být typem ukazatele funkce.
  • CS8806: Jazyk nepodporuje konvenci volání 'convention'.
  • CS8807: 'specifikátor' není platný specifikátor volací konvence pro ukazatel na funkci.
  • CS8808: Modifikátor není platný modifikátor návratového typu ukazatele funkce. Platné modifikátory jsou "ref" a "ref readonly".
  • CS8809: Návratový typ může mít pouze jeden modifikátor 'modifier'.
  • CS8811: Nelze převést skupinu metod 'method' na typ delegáta 'type'.
  • CS8909: Porovnání ukazatelů na funkce může přinést neočekávaný výsledek, protože ukazatele na stejnou funkci mohou být odlišné.
  • CS8911: Použití typu ukazatele funkce v tomto kontextu není podporováno.

Neshody podpisů delegáta

  • CS0059: Nekonzistentní přístupnost: typ parametru 'type' je méně přístupný než delegát 'delegate'.
  • CS0123: Žádné přetížení metody neodpovídá delegátu "delegate".
  • CS0148: Delegát 'delegate' nemá žádný platný konstruktor.
  • CS0410: Pro metodu neexistuje žádné přetížení, které by mělo správné parametry a návratový typ.

Při vytváření nebo přiřazování delegáta kompilátor ověří, že podpis cílové metody odpovídá deklaraci typu delegáta. Podpis obsahuje typy parametrů, návratový typ a přístupnost. Úplná pravidla najdete v tématu Delegáti a omezení přístupnosti ve specifikaci jazyka C#.

  • Změňte všechny typy parametrů v deklaraci delegáta na typy, které jsou alespoň tak přístupné jako samotný delegát (CS0059). public Delegát nemůže odkazovat na méně přístupný typ v seznamu parametrů, protože volající mimo sestavení by nemohl argument zadat. Další informace naleznete v tématu Přístupové modifikátory.
  • Upravte podpis metody nebo podpis delegáta tak, aby typy parametrů a návratové typy přesně odpovídaly (CS0123). Kompilátor vyžaduje přesnou shodu podpisu při přiřazování metody delegátovi.
  • Ověřte, že delegát byl zkompilován odpovídajícím kompilátorem (CS0148). K této chybě dochází při importu spravovaného sestavení sestaveného kompilátorem, který vytvořil neformulovaný konstruktor delegáta. Překompilujte sestavení pomocí kompilátoru kompatibilního se standardy a vyřešte chybu.

Poznámka:

CS0410 již není vytvořen aktuálním kompilátorem jazyka C#. Stejná podmínka teď vytváří místo toho CS0123. Starší sestavení zkompilovaná se staršími kompilátory mohou stále odkazovat na tento kód chyby.

CS0148 je diagnostika určená jen pro sestavení:

Poznámka:

Toto upozornění se hlásí pouze během explicitních operací sestavení nebo opětovného sestavení . Nezobrazuje se během psaní v integrovaném vývojovém prostředí jako součást diagnostiky IntelliSense. To znamená, že pokud upozornění opravíte použitím pole nebo jeho odstraněním, upozornění může v seznamu chyb zůstat, dokud projekt znovu nepostavíte nebo nepřestavíte.

Omezení typu delegáta

  • CS0644: 'class' nemůže odvodit ze speciální třídy 'class'.
  • CS1599: Návratový typ metody, delegáta nebo ukazatele funkce nemůže být type.
  • CS1958: Výrazy inicializátoru objektů a kolekcí nelze použít pro výraz vytvoření delegáta.

Jazyk C# omezuje způsob použití určitých speciálních typů, včetně System.Delegate. Úplná pravidla pro deklarace delegátů najdete v tématu Delegáti a Delegáti ve specifikaci jazyka C#.

  • Místo explicitní základní třídy použijte deklaraci delegate (CS0644). Třídy nemohou explicitně dědit z System.Delegate, System.Enum, System.ValueTypenebo System.Array. Kompilátor používá tyto typy jako implicitní základní třídy. Například každá delegate deklarace implicitně pochází z System.Delegate.
  • Změňte návratový typ na typ, který je povolený jako návratová hodnota (CS1599). Některé typy v knihovně tříd .NET, například TypedReference, RuntimeArgumentHandle a ArgIterator, nelze použít jako návratové typy pro metody, delegáty nebo ukazatele funkce, protože mohou potenciálně povolit nebezpečné operace zásobníku.
  • Odeberte složené závorky za výrazem vytvoření delegáta (CS1958). Delegáti nemají členy, které můžete nastavit prostřednictvím syntaxe inicializátoru objektu nebo kolekce. Pokud máte { } za výrazem new DelegateType(method) , odeberte složené závorky.

Neshody signatur ukazatele funkce

  • CS8755: Modifikátor nelze použít jako modifikátor parametru ukazatele funkce.
  • CS8756: Ukazatel funkce „type“ nepřebírá „count“ argumentů.
  • CS8757: Nepřítomnost přetížení pro 'metoda' neodpovídá typu ukazatele funkce.
  • CS8758: Neshoda ref mezi metodou a ukazatelem funkce type.
  • CS8759: Nelze vytvořit ukazatel funkce pro metodu, protože není statickou metodou.
  • CS8787: Nelze převést skupinu metod na ukazatel funkce. (Chybí vám '&'?)
  • CS8788: Nelze použít rozšiřující metodu s přijímačem jako cíl operátoru '&'.
  • CS8811: Nelze převést skupinu metod 'method' na typ delegáta 'type'.

Když přiřadíte metodu ukazatel funkce pomocí operátoru address-of (&), kompilátor zkontroluje, zda podpis metody odpovídá typu ukazatele funkce. Úplná pravidla pro deklarace ukazatelů funkce a použití naleznete v tématu Ukazatele funkce a nebezpečný kód.

  • Odeberte nepodporovaný modifikátor z parametru ukazatele funkce (CS8755). Parametry ukazatele funkce podporují pouze ref, outa in modifikátory. Jiné modifikátory parametrů, například params, nejsou platné v deklarací typu ukazatele funkce.
  • Změňte počet argumentů na webu volání tak, aby odpovídal počtu parametrů ukazatele funkce (CS8756). Typ ukazatele funkce definuje pevný počet parametrů a musíte předat přesně tolik argumentů.
  • Upravte podpis metody tak, aby jeho typy parametrů, návratový typ a počet parametrů odpovídaly typu ukazatele funkce (CS8757). Na rozdíl od delegátů nepodporují ukazatele funkcí implicitní převody mezi kompatibilními podpisy metod. Shoda musí být přesná.
  • Zarovnejte modifikátory ref, out nebo in mezi parametry metody a parametry typu ukazatele na funkci (CS8758). Druh reference každého parametru se musí přesně shodovat. Parametr ref nemůže splňovat pozici in ani out v typu ukazatele funkce.
  • Změňte cílovou metodu na static (CS8759). Ukazatele funkcí můžou odkazovat pouze na statické metody, protože představují adresy nezpracovaných funkcí bez přidružené instance objektu.
  • & Přidejte operátor před skupinu metod při přiřazování k ukazateli funkce (CS8787). Na rozdíl od delegátů vyžadují ukazatele funkce explicitní adresu operátoru: delegate*<void> ptr = &MyMethod;.
  • Místo rozšiřující metody použijte statickou metodu s příjemcem (CS8788). Operátor & vyžaduje přímý odkaz na metodu. Rozšiřující metody volané v instanci mají implicitní přijímač, který nelze zachytit v ukazateli funkce.
  • & Odeberte operátor a místo toho použijte syntaxi delegáta nebo změňte cílový typ z delegáta na ukazatel funkce (CS8811). Operátor & vytvoří ukazatel funkce, nikoli delegát. Pokud chcete přiřadit skupinu metod k typu delegáta, vynecháte & a použijte standardní syntaxi vytváření delegátů.

Konvence volání ukazatele funkce a návratové typy

  • CS8786: Volací konvence 'convention' není kompatibilní s 'convention'.
  • CS8806: Jazyk nepodporuje volací konvenci 'convention'.
  • CS8807: 'specifier' není platný specifikátor konvence volání pro ukazatel funkce.
  • CS8808: Modifikátor není platný modifikátor návratového typu ukazatele funkce. Platné modifikátory jsou "ref" a "ref readonly".
  • CS8809: Návratový typ může mít pouze jeden 'modifier' modifikátor.

Deklarace ukazatelů funkce zahrnují konvenci volání a volitelné modifikátory návratového typu. Kompilátor tyto možnosti ověří. Úplná pravidla najdete v tématu Ukazatele funkce.

  • Změňte konvenci volání metody nebo konvenci volání typu ukazatele funkce tak, aby odpovídaly (CS8786). Když přiřadíte metodu ukazateli funkce, musí být konvence volání kompatibilní. Například metodu používající Cdecl nelze přiřadit k ukazateli funkce deklarovanému pomocí Stdcall.
  • Použijte podporovanou konvenci volání v deklaraci ukazatele funkce (CS8806). Jazyk podporuje managed a unmanaged. Pro konkrétní nespravovanou konvenci použijte unmanaged klíčové slovo s konvencí v hranatých závorkách, například unmanaged[Cdecl], unmanaged[Stdcall], unmanaged[Thiscall]nebo unmanaged[Fastcall].
  • Nahraďte neplatný specifikátor podporovanou konvencí volání (CS8807). Použijte managed, unmanagednebo unmanaged s typem konvence volání v hranatých závorkách (například unmanaged[Cdecl]).
  • Použijte pouze jako modifikátor návratového typu ref nebo ref readonly (CS8808). Jiné modifikátory, například out nebo in, nejsou platné pro návratové typy ukazatele funkce.
  • Odeberte modifikátor nadbytečného návratového typu, aby se zobrazil jen jeden ref nebo ref readonly (CS8809). Kompilátor umožňuje nejméně jeden modifikátor návratového typu na deklaraci ukazatele funkce.

Omezení použití ukazatele funkce

  • CS8789: Typ místního deklarovaného v pevném příkazu nemůže být typem ukazatele funkce.
  • CS8909: Porovnání ukazatelů na funkce může přinést neočekávaný výsledek, protože ukazatele na stejnou funkci mohou být odlišné.
  • CS8911: Použití typu ukazatele funkce v tomto kontextu není podporováno.

Kompilátor omezuje způsob použití typů ukazatelů funkce v určitých kontextech. Úplná pravidla najdete v tématu Ukazatele funkce.

  • Změňte typ místní proměnné v fixed příkazu na datový typ ukazatele místo typu ukazatele funkce (CS8789). Příkaz fixed uzamkne spravované objekty v paměti pro přístup k datům. Ukazatele funkce představují adresy kódu, ne data a nelze je připnout.
  • Vyhněte se porovnávání ukazatelů na funkce pro rovnost (CS8909). Toto upozornění označuje, že porovnání ukazatelů na funkce s == nebo != může způsobit neočekávané výsledky. Modul runtime může vrátit různé ukazatele pro stejnou funkci kvůli implementačním detailům, jako je například použití thunků nebo kompilace JIT. Chcete-li potlačit upozornění při potvrzení, že je porovnání úmyslné, použijte #pragma warning disable CS8909.
  • Přesuňte použití ukazatele funkce do podporovaného kontextu (CS8911). Typy ukazatelů funkce nelze použít v určitých pozicích, jako jsou argumenty atributů nebo typeof výrazy. Změna struktury kódu, aby se zabránilo použití typů ukazatelů funkce v nepodporovaných kontextech.