Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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).
publicDelegá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 zSystem.Delegate,System.Enum,System.ValueTypeneboSystem.Array. Kompilátor používá tyto typy jako implicitní základní třídy. Například každádelegatedeklarace implicitně pochází zSystem.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ýrazemnew 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,outainmodifikátory. Jiné modifikátory parametrů, napříkladparams, 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,outneboinmezi parametry metody a parametry typu ukazatele na funkci (CS8758). Druh reference každého parametru se musí přesně shodovat. Parametrrefnemůže splňovat poziciinanioutv 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í
Cdeclnelze přiřadit k ukazateli funkce deklarovanému pomocíStdcall. - Použijte podporovanou konvenci volání v deklaraci ukazatele funkce (CS8806). Jazyk podporuje
managedaunmanaged. Pro konkrétní nespravovanou konvenci použijteunmanagedklíčové slovo s konvencí v hranatých závorkách, napříkladunmanaged[Cdecl],unmanaged[Stdcall],unmanaged[Thiscall]nebounmanaged[Fastcall]. - Nahraďte neplatný specifikátor podporovanou konvencí volání (CS8807). Použijte
managed,unmanagednebounmanageds typem konvence volání v hranatých závorkách (napříkladunmanaged[Cdecl]). - Použijte pouze jako modifikátor návratového typu
refneboref readonly(CS8808). Jiné modifikátory, napříkladoutneboin, nejsou platné pro návratové typy ukazatele funkce. - Odeberte modifikátor nadbytečného návratového typu, aby se zobrazil jen jeden
refneboref 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
fixedpříkazu na datový typ ukazatele místo typu ukazatele funkce (CS8789). Příkazfixeduzamkne 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
typeofvýrazy. Změna struktury kódu, aby se zabránilo použití typů ukazatelů funkce v nepodporovaných kontextech.