Chyby a upozornění související se zdrojovými generátory a průsečíky

K následujícím chybám dochází, když kompilátor během kompilace načte generátory zdrojů nebo průsečíky:

  • CS9137: Funkce „zachytávače“ není v tomto oboru názvů povolena. Přidejte <Features>InterceptorsPreview</Features> do svého projektu.
  • CS9138: Metoda method nelze použít jako průsečík, protože jeho typ obsahuje parametry typu.
  • CS9139: Nelze zachytit: kompilace neobsahuje soubor s cestou.
  • CS9140: Nelze zachytit: kompilace neobsahuje soubor s cestou „path“. Chtěli jste použít cestu „candidatePath“?
  • CS9141: Zadaný řádek a číslo znaku neodkazují na název zachytitelné metody, nýbrž na token „token“.
  • CS9142: Daný soubor obsahuje n řádky, které jsou menší než zadané číslo mřádku .
  • CS9143: Zadaný řádek je c znaků dlouhý, což je méně než zadané číslo znaků n.
  • CS9144: Nelze zachytit metodu M s průsečíkem V , protože podpisy se neshodují.
  • CS9145: Nelze zachytit: Cesta není namapovaná. Očekává se mapovaná cesta.
  • CS9146: Interceptorová metoda musí být obyčejnou členskou metodou.
  • CS9147: Zadaný řádek a číslo znaku neodkazuje na začátek tokenu "token". Chtěli jste použít čáru "n" a znak "c"?
  • CS9148: Interceptor musí mít parametr, který odpovídá this parametru.
  • CS9149: Interceptor nesmí mít this parametr, protože metoda nemá this parametr.
  • CS9150: Průsečík nemůže mít null cestu k souboru.
  • CS9151: Možný název M metody nelze zachytit, protože se nevyvolává.
  • CS9152: Nelze zachycovat volání v souboru s cestou "path", protože tuto cestu má více souborů v kompilaci.
  • CS9153: Označené volání je zachyceno několikrát.
  • CS9155: Nelze zachytit volání s M, protože není přístupné v rámci V.
  • CS9156: Nelze zachytit volání M s V kvůli rozdílu v modifikátorech 'scoped' nebo [UnscopedRef] atributech.
  • CS9157: Zadaná InterceptsLocationAttribute čísla řádků a znaků musí být kladná.
  • CS9160: Operátor nameof nelze zachytit.
  • CS9161: Průsečík nelze označit UnmanagedCallersOnlyAttribute.
  • CS9177: Metoda "method" musí být ne generická nebo musí mít arity 'arity', aby odpovídala 'target'.
  • CS9178: Metoda "method" musí být ne generická, aby odpovídala cíli.
  • CS9206: Průsečík nelze deklarovat v globálním oboru názvů.
  • CS9207: Nelze zachytit „method“, protože nejde o volání běžné členské metody.
  • CS9231: Datový argument InterceptsLocationAttribute není ve správném formátu.
  • CS9232: Verze "verze" formátu průsečíků není podporována. Nejnovější podporovaná verze je 1.
  • CS9233: Nelze zachycovat volání v souboru "soubor", protože je duplikováno jinde v kompilaci.
  • CS9234: Nelze zachytit volání v souboru "soubor", protože v kompilaci nebyl nalezen odpovídající soubor.
  • CS9235: Datový argument InterceptsLocationAttribute odkazuje na neplatnou pozici v souboru "file".

K následujícím upozorněním dochází, když kompilátor během kompilace načte generátory zdrojů nebo průsečíky:

  • CS8032: Instanci analyzátoru „analyzer“ nelze vytvořit ze sestavení „assembly“: „reason“.
  • CS8033: Sestavení „assembly“ neobsahuje žádné analyzátory.
  • CS8034: Nelze načíst sestavení analyzátoru 'assembly' : 'reason'
  • CS8040: Některé typy v sestavení analyzátoru 'assembly' se přeskakují kvůli výjimce ReflectionTypeLoadException: 'exception'.
  • CS8700: Více konfiguračních souborů analyzátoru nemůže být ve stejném adresáři (adresář).
  • CS8784: Generátor 'generator' se nepodařilo inicializovat. Nebude zahrnut do výstupu a v důsledku toho může docházet k chybám kompilace. Výjimka byla typu 'exception' se zprávou 'message'.
  • CS8785: Generátoru 'generator' se nepodařilo vygenerovat zdrojový kód. Nepřispěje do výstupu a v důsledku toho mohou nastat chyby kompilace. Výjimka byla typu 'exception' se zprávou 'message'.
  • CS8850: Sestava obsahující typ "type" odkazuje na .NET Framework, což není podporováno.
  • CS9057: Sestavení analyzátoru 'assembly' nelze použít, protože odkazuje na verzi kompilátoru 'version', která je novější než aktuálně spuštěná verze 'currentVersion'.
  • CS9067: Analyzátor odkazuje na odkaz "reference" zadaný vícekrát
  • CS9154: Zachycení volání na M se zachytávačem V, ale podpisy se neshodují.
  • CS9158: Nullable typy odkazů v návratovém typu neodpovídají interceptovatelné metodě.
  • CS9159: Nullovatelnost odkazových typů v typu parametru neodpovídá interceptované metodě.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' není podporován. Místo toho přejděte na generování těchto atributů na základě interceptableLocation. (https://github.com/dotnet/roslyn/issues/72133)

Tyto chyby a upozornění se řídí těmito motivy:

Selhání generátorů zdrojů

  • CS8784: Generátor „generator“ se nepodařilo inicializovat. Nepřispěje k výstupu a v důsledku toho mohou nastat chyby kompilace. Výjimka byla typu „exception“ se zprávou „message“.
  • CS8785: Generátoru „generator“ se nepodařilo vygenerovat zdrojový kód. Nepřispěje k výstupu a v důsledku toho mohou nastat chyby kompilace. Výjimka byla typu „exception“ se zprávou „message“.

Tato upozornění značí, že generátor zdrojů během kompilace vyvolal neošetřenou výjimku. Generátory zdrojového kódu běží jako součást procesu sestavení a v případě selhání nemůže generátor přidat svůj výstup do kompilace. Další informace o implementaci generátorů zdrojů najdete v tématu Generátory zdrojů.

Pokud chcete tato upozornění opravit, postupujte podle těchto pokynů:

  • Prozkoumejte podrobnosti úplné výjimky ve výstupu sestavení a identifikujte původní příčinu (CS8784, CS8785). Výstražná zpráva obsahuje typ výjimky, zprávu a trasování zásobníku, které může vám nebo autorovi generátoru pomoci diagnostikovat selhání.
  • Ujistěte se, že jsou v projektu k dispozici všechny požadované závislosti pro zdrojový generátor (CS8784). K selhání inicializace často dochází, když generátor nemůže najít požadované sestavení nebo prostředek během spuštění. Ověřte, že je správně nainstalovaný balíček NuGet generátoru a zda jsou vyřešeny všechny tranzitivní závislosti.
  • Ohlaste selhání správce zdrojového generátoru, pokud výjimka pochází z kódu generátoru třetích stran (CS8784, CS8785). Do hlášení chyby zahrňte úplné podrobnosti o výjimce z výstupu sestavení.
  • Pokud jste vytvořili generátor zdrojů, přidejte zpracování výjimek v rámci vašich Initialize metod nebo Execute metod pro zachycení a hlášení chyb bez problémů (CS8784, CS8785).

Kompatibilita analyzátoru a generátoru zdrojů

  • CS8032: Nelze vytvořit instanci analyzátoru 'analyzer' ze sestavení 'assembly' : 'reason'.
  • CS8033: Sestavení 'assembly' neobsahuje žádné analyzátory.
  • CS8034: Nelze načíst sestavení analyzátoru 'assembly' : 'reason'
  • CS8040: Přeskakují se některé typy v sestavení analyzátoru 'assembly' kvůli výjimce ReflectionTypeLoadException: 'exception'.
  • CS8700: Více konfiguračních souborů analyzátoru nemůže být ve stejném adresáři (adresář).
  • CS8850: Sestavení „assembly“ obsahující typ „type“ odkazuje na .NET Framework, který není podporován.
  • CS9057: Sestavení analyzátoru „assembly“ nelze použít, protože odkazuje na verzi kompilátoru „version“, která je novější než aktuálně spuštěná verze „currentVersion“.
  • CS9067: Analyzátor odkazuje na odkaz "reference" zadaný vícekrát

Tato upozornění a chyby označují problémy s načítáním, vytvářením instancí nebo konfigurací sestavení analyzátorů a generátorů zdrojového kódu. Vzhledem k tomu, že se generátory zdrojů načítají jako sestavení analyzátorů, vztahují se tyto diagnostické zprávy na analyzátory i generátory zdrojů.

Pokud chcete tyto problémy opravit, postupujte podle těchto pokynů:

  • Upgradujte verzi sady .NET SDK nebo kompilátoru tak, aby odpovídaly požadavkům analyzátoru, nebo použijte starší verzi balíčku analyzátoru, který je kompatibilní s aktuálním kompilátorem (CS9057). K této chybě dochází, když sestavení analyzátoru cílí na novější verzi rozhraní Roslyn API, než poskytuje spuštěný kompilátor.
  • Odeberte z projektu duplicitní odkazy na analyzátor (CS9067). Zkontrolujte, jestli soubor projektu neobsahuje opakované <Analyzer> prvky nebo <PackageReference> prvky, které obsahují stejné sestavení analyzátoru prostřednictvím různých cest. Přechodné závislosti balíčků můžou také způsobit duplicity.
  • Ověřte, že sestavení analyzátoru je platné sestavení .NET a není poškozené (CS8034). Pokud sestavení nelze vůbec načíst, ujistěte se, že soubor existuje v odkazované cestě a byl vytvořen pro kompatibilní cílovou architekturu. Znovu sestavte nebo přeinstalujte balíček NuGet, abyste získali novou kopii.
  • Ujistěte se, že typ analyzátoru obsahuje veřejný konstruktor bez parametrů (CS8032). Kompilátor vytvoří instance analyzátorů voláním výchozího konstruktoru. Pokud konstruktor vyvolá výjimku nebo vyžaduje parametry, analyzátor se nedá vytvořit.
  • Ověřte, že odkazované sestavení ve skutečnosti exportuje analyzátor nebo typy generátoru zdroje (CS8033). Sestavení odkazované jako analyzátor musí obsahovat typy, které implementují DiagnosticAnalyzer nebo ISourceGenerator/IIncrementalGenerator. Pokud je sestavení běhovou závislostí spíše než analyzátorem, přidejte je místo toho jako běžnou referenci na projekt nebo balíček.
  • Vyřešte problémy s načítáním typů v sestavení analyzátoru tím, že zajistíte, že jsou k dispozici všechny jeho závislosti (CS8040). Obvykle ReflectionTypeLoadException znamená, že sestavení odkazuje na typy z jiných sestavení, která nelze najít. Ujistěte se, že všechny požadované závislosti jsou součástí balíčku NuGet analyzátoru.
  • Zajistěte, aby konfigurační soubory analyzátoru (.editorconfig nebo .globalconfig) byly jedinečné pro každý adresář (CS8700). Kompilátor neumožňuje více konfiguračních souborů analyzátoru ve stejném adresáři, protože pravidla priority by byla nejednoznačná. Sloučí soubory nebo odebere duplikát.
  • Aktualizujte analyzátor nebo generátor zdroje tak, aby cílil na .NET Standard nebo moderní .NET místo .NET Frameworku (CS8850). Sestavení, která odkazují na .NET Framework, nejsou podporována v moderní sadě nástrojů kompilátoru .NET. Pokud analyzátor udržujete, znovu ho nasměrujte na netstandard2.0. Pokud se jedná o balíček třetí strany, upgradujte na verzi, která podporuje moderní .NET.

Průsečíky jsou experimentální.

  • CS9137: Funkce „interceptory“ není v tomto oboru názvů povolena. Přidejte do projektu <Features>InterceptorsPreview</Features>.

Pokud chcete použít průsečíky, přidejte <Features>InterceptorsPreview</Features> prvek do souboru projektu v oddílu <PropertyGroup> (CS9137). Průsečíky jsou experimentální funkcí a ve výchozím nastavení nejsou povolené. Tento výslovný souhlas je vyžadován, protože funkce interceptorů může podléhat nekompatibilním změnám nebo být v budoucích verzích odebrána. Kompilátor potřebuje potvrzení, že před povolením jeho použití rozumíte rizikům. Další informace o průsečíkech a jejich funkcích najdete v dokumentaci k funkcím jazyka C# 12.

Neshoda podpisů

Následující chyby a upozornění označují neshodu mezi metodou přerušení a přerušitelnou metodou.

  • CS9144: Nelze zachytit metodu M s průsečíkem V , protože podpisy se neshodují.
  • CS9148: Interceptor musí mít parametr, který odpovídá this parametru.
  • CS9149: Interceptor nesmí mít this parametr, protože metoda nemá this parametr.
  • CS9155: Nelze zachytit volání pomocí M, protože není přístupné v rámci V.
  • CS9156: Nelze zachytit volání M pomocí V kvůli rozdílu v modifikátorech 's vymezeným oborem' nebo [UnscopedRef] atributech.
  • CS9177: Metoda "method" musí být ne generická nebo musí mít arity 'arity', aby odpovídala 'target'.
  • CS9178: Metoda "method" musí být ne generická, aby odpovídala cíli.

Kromě toho následující upozornění označují neshodu v podpisech interceptoru a zachycované metody.

  • CS9154: Zachycení volání na M s přerušovačem V, ale podpisy se neshodují.
  • CS9158: Nulovatelnost referenčních typů v návratovém typu neodpovídá zachytitelné metodě.
  • CS9159: Nullovatelnost referenčních typů v typu parametru neodpovídá zachytitelné metodě.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' není podporován. Místo toho přejděte na generování těchto atributů na základě interceptableLocation. (https://github.com/dotnet/roslyn/issues/72133)

Ujistěte se, že vaše zachytávací metoda odpovídá podpisu a požadavkům na přístup zachytávané metody, abyste tyto problémy opravili.

  • Ujistěte se, že podpis metody interceptora přesně odpovídá metodě, kterou lze zachytit (CS9144, CS9154). Typy parametrů, modifikátory, pořadí a návratový typ musí být identické. Zkontrolujte obě deklarace metody a zarovnejte jejich podpisy.
  • Přidejte parametr this do zachycovače, pokud je zachycovatelná metoda instanční metoda (CS9148), nebo odeberte parametr this, pokud je zachycovatelná metoda statická (CS9149). Instance interceptory vyžadují this parametr deklarujícího typu, zatímco statické interceptory nesmí mít žádný.
  • Deklarujte svůj průsečík v umístění, kde je přístupná metoda zachycení (CS9155). Pokud je metoda internal zachycovatelná, zachytávač musí být ve stejném sestavení. Pokud je to private, musí být přerušovač ve stejném typu nebo vnořeném typu.
  • Přiřaďte scoped modifikátory a [UnscopedRef] atributy odpovídajícím ref parametrům (CS9156). Každý ref parametr v zachytávači musí mít stejné anotace životnosti jako odpovídající parametr v zachytitelné metodě pro zajištění bezpečnosti paměti.
  • Ujistěte se, že obě metody mají odpovídající generické arity (CS9177, CS9178). Pokud je zachycovatelná metoda ne generická, musí být průsečík také ne generický. Pokud průsečíkná metoda obsahuje parametry typu, musí mít průsečík stejný počet parametrů typu s kompatibilními omezeními.
  • Porovnejte poznámky k nulovatelnosti v návratovém typu (CS9158) a typech parametrů (CS9159). Povolte v projektu nulovatelné odkazové typy a zajistěte, aby poznámky o nulovatelnosti přesně odpovídaly zachytitelné metodě, aby byla zachována bezpečnost typů.
  • Místo zastaralého InterceptableLocation konstruktoru (InterceptsLocationAttribute) použijte aktualizované generování založené na (string, int, int) pro . Novější formát poskytuje lepší podporu nástrojů a ověřování v době kompilace. Pokyny k migraci najdete v problému s GitHubem .

Nesprávné mapování

Zachytávače vyžadují mapování zdroje, které mapuje zachytitelnou metodu a metodu zachytávače. Následující chyby značí problém s mapováním:

  • CS9139: Nelze zachytit: kompilace neobsahuje soubor s cestou.
  • CS9140: Nelze zachytit: kompilace neobsahuje soubor s cestou 'path'. Chtěli jste použít cestu 'candidatePath'?
  • CS9141: Zadaný řádek a číslo znaku neodkazují na název zachytitelné metody, ale na token 'token'.
  • CS9142: Daný soubor obsahuje n řádky, které jsou menší než zadané číslo mřádku .
  • CS9143: Zadaný řádek je dlouhý c znaků, což je méně, než zadaný počet znaků n.
  • CS9145: Nelze zachytit: Cesta není namapovaná. Očekává se namapovaná cesta.
  • CS9147: Zadaný řádek a číslo znaku neodkazuje na začátek tokenu "token". Chtěli jste použít čáru "n" a znak "c"?
  • CS9150: Průsečík nemůže mít null cestu k souboru.
  • CS9157: Zadaná InterceptsLocationAttribute čísla řádků a znaků musí být kladná.

Pokud chcete opravit chyby mapování, ujistěte InterceptsLocationAttribute se, že obsahuje platné cesty k souborům a přesné informace o poloze:

  • Ověřte, že cesta k souboru přesně odpovídá souboru v kompilaci (CS9139, CS9140). Použijte přesnou cestu, jak se objevuje ve vašem projektu, včetně správného psaní velkých a malých písmen a oddělovačů adresářů. Pokud kompilátor navrhne alternativní cestu, aktualizujte atribut tak, aby používal tuto cestu.
  • Při práci se zdrojovými generátory, které transformují cesty k souborům (CS9145), použijte mapované cesty k souborům. Generátory zdrojů často přemapují cesty pro vygenerované soubory a musíte použít mapovanou cestu, kterou kompilátor rozpozná, nikoli původní zdrojovou cestu.
  • Ujistěte se, že cesta k souboru není null ve vašem InterceptsLocationAttribute (CS9150). Každé zachycení musí obsahovat platnou cestu k souboru, která není null a identifikuje zdrojový soubor obsahující volání k zachycení.
  • Zadejte kladná, 1řádková a znaková čísla (CS9157). Čísla řádků a pozice znaků musí začínat číslem 1, nikoli 0. Při výpočtu pozic ověřte, že generátor zdrojů používá indexování založené na 1.
  • Zaměřte se na přesný začátek názvu metody tokenu (CS9141, CS9147). Čísla řádků a znaků musí identifikovat první znak názvu metody ve volání, nikoli prázdné znaky, operátory nebo jiné tokeny. Pokud kompilátor navrhne alternativní souřadnice, použijte je k zacílení správného spuštění tokenu.
  • Zůstaňte v mezích souboru (CS9142, CS9143). Ověřte, že číslo řádku nepřekračuje celkový počet řádků a číslo znaku nepřekračuje délku řádku. Přepočítejte pozice, pokud se zdrojový soubor od vygenerování atributu změnil.

Nesprávná deklarace průsečíku

Následující chyby označují problémy s deklaracemi průsečíku, včetně problémů s InterceptsLocationAttribute formátem nebo porušením pravidel průsečíku:

  • CS9138: Metoda method nelze použít jako průsečík, protože jeho typ obsahuje parametry typu.
  • CS9146: Metoda průsečíku musí být běžná metoda člena.
  • CS9151: Možný název M metody nelze zachytit, protože se nevyvolává.
  • CS9152: Nelze zachycovat volání v souboru s cestou "path", protože tuto cestu má více souborů v kompilaci.
  • CS9153: Označené volání je zachyceno několikrát.
  • CS9160: Operátor nameof nelze zachytit.
  • CS9161: Průsečík nelze označit UnmanagedCallersOnlyAttribute.
  • CS9206: Průsečík nelze deklarovat v globálním oboru názvů.
  • CS9207: Nelze zachytit „method“, protože nejde o volání běžné členské metody.
  • CS9231: Datový argument InterceptsLocationAttribute není ve správném formátu.
  • CS9232: Verze "verze" formátu zachytávačů není podporována. Nejnovější podporovaná verze je '1'.
  • CS9233: Nelze zachycovat volání v souboru "soubor", protože je duplikováno jinde v kompilaci.
  • CS9234: Nelze zachytit volání v souboru "soubor", protože v kompilaci nebyl nalezen odpovídající soubor.
  • CS9235: Datový argument InterceptsLocationAttribute odkazuje na neplatnou pozici v souboru "file".

Chcete-li opravit chyby deklarace průsečíku, postupujte podle těchto pravidel pro platné deklarace průsečíku a InterceptsLocationAttribute použití:

  • Správně naformátujte InterceptsLocationAttribute datový argument (CS9231). Atribut vyžaduje speciálně strukturovaná data, která kódují cestu k souboru a informace o poloze. Ujistěte se, že generátor zdrojů vytváří data v očekávaném formátu odpovídajícím specifikaci aktuálních průsečíků.
  • Ve vaší InterceptsLocationAttribute verzi (CS9232) použijte verzi 1, protože se jedná o nejnovější podporovanou verzi. Aktualizujte zdrojový generátor na výstupní atributy formátu verze 1 místo nepodporovaných čísel verzí.
  • Zajistěte jedinečné cesty k souborům ve vaší kompilaci (CS9233, CS9234). Pokud kompilace obsahuje duplicitní cesty k souborům, přejmenujte nebo změňte uspořádání souborů, aby byla každá cesta jedinečná. Ověřte, že cesta k souboru v atributu odpovídá souboru, který je skutečně součástí kompilace.
  • Ověřte umístění datových bodů do platných umístění kódu (CS9235). Čísla řádků a znaků musí odkazovat na platný bod průsečíku v zadaném souboru. Znovu vygenerujte atribut, pokud se zdrojový soubor změnil nebo pokud pozice spadá mimo hranice souboru.
  • Deklarujte ne generické metody průsečíku v ne generických typech (CS9138). Průsečíky nelze deklarovat v typech, které mají parametry typu. Pokud potřebujete zachytit generickou metodu, vytvořte negenerický interceptor v negenerickém kontejnerovém typu, který pracuje s konkrétním zkonstruovaným typem.
  • Udělejte z interceptorů běžné metody členů (CS9146). Zachytávače nesmí být operátory, konstruktory, finalizátory, vlastnosti ani indexery. Deklarujte průsečík jako běžnou statickou metodu nebo metodu instance.
  • Zachycení skutečných volání metody, nikoli výrazů (CS9151, CS9207). Pouze můžete zachytit volání běžných metod členů, které jsou vyvolány. Nemůžete zachytit skupiny metod, delegáty ani metody odkazované bez zavolání. Zajistěte, aby zachycovatelné umístění identifikovalo skutečné volání metody.
  • Odstraňte opakující se pokusy o zachycení (CS9153). Každé volání metody lze zachytit pouze jednou. Pokud více InterceptsLocationAttribute instancí cílí na stejné volání, odeberte všechny kromě jedné, abyste vyřešili nejednoznačnost.
  • Operátory nezachycujte nameof (CS9160). Operátor nameof nevolá metody za běhu, takže je nelze zachytit. Zachycuje pouze skutečná volání metod, která jsou vykonávána za běhu programu.
  • Odeberte UnmanagedCallersOnlyAttribute z průsečíků (CS9161). Průsečíky musí být volatelné ze spravovaného kódu a nesmí být označené znakem UnmanagedCallersOnlyAttribute. Odeberte atribut z deklarace interceptorové metody.
  • Deklarujte zachytávače v oboru názvů (CS9206). Průsečíky nelze deklarovat v globálním oboru názvů a musí být obsaženy v alespoň jedné deklaraci oboru názvů. Zabalte třídu přerušovače do jmenového prostoru.
  • Řešení duplicitních cest k souborům na úrovni kompilace (CS9152) Pokud v kompilaci sdílí více souborů stejnou cestu, kompilátor nemůže určit, který soubor se má zachytit. Ujistěte se, že konfigurace sestavení vytváří jedinečné cesty k souborům nebo pro zdrojové soubory používá jinou strategii organizace.