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 kompilátoru:
- CS0132: Konstruktor: Statický konstruktor musí být bez parametrů.
- CS0514: Statický konstruktor nemůže mít explicitní volání konstruktoru "this" nebo "base".
- CS0515: Modifikátory přístupu nejsou u statických konstruktorů povoleny.
- CS0516: Konstruktor 'constructor' nemůže volat sám sebe.
- CS0517: Třída nemá žádnou základní třídu a nemůže volat základní konstruktor.
- CS0522: Struktury nemohou volat konstruktory tříd, ze kterých jsou odvozeny.
- CS0526: Rozhraní nemohou obsahovat konstruktory instancí.
- CS0568: Struktury nemohou obsahovat explicitní konstruktory bez parametrů.
- CS0573: 'Deklarace pole': nelze mít inicializátory instančních polí ve strukturách.
- CS0710: Statické třídy nemohou mít konstruktory instance.
- CS0768: Konstruktor nemůže volat sám sebe prostřednictvím jiného konstruktoru.
- CS1018: Bylo očekáváno klíčové slovo "this" nebo "base".
- CS8054: Výčty nemohou obsahovat explicitní konstruktory bez parametrů.
- CS8091: Nemůže být extern a mít inicializátor konstruktoru.
- CS8760: "event": extern událost nemůže mít inicializátor.
- CS8358: Nelze použít konstruktor atributů, protože má parametry in nebo ref readonly.
- CS8813: Inicializátor modulu musí být běžná metoda člena
- CS8814: Metoda inicializátoru modulu musí být přístupná na úrovni modulu.
- CS8815: Metoda inicializátoru modulu musí být statická a jiná než virtuální, nesmí mít žádné parametry a musí vracet hodnotu void.
- CS8816: Metoda inicializátoru modulu nesmí být obecná a nesmí být obsažena v obecném typu.
- CS8861: Neočekávaný seznam argumentů
- CS8862: Konstruktor deklarovaný v typu se seznamem parametrů musí mít inicializátor konstruktoru this.
- CS8867: Nebyl nalezen žádný přístupný konstruktor kopírování v základním typu '{0}'.
- CS8868: Konstruktor kopírování v záznamu musí volat konstruktor kopírování základního objektu nebo konstruktor bez parametrů, pokud záznam dědí z objektu.
- CS8878: Konstruktor kopírování '{0}' musí být veřejný nebo chráněný, protože záznam není zapečetěn.
- CS8900: Inicializátor modulu nemůže být atributem UnmanagedCallersOnly.
- CS8901: Metoda je atributem UnmanagedCallersOnly a nelze ji volat přímo. Získejte ukazatel funkce na tuto metodu.
- CS8902: Metoda je atributem UnmanagedCallersOnly a nelze jej převést na typ delegáta. Získejte ukazatel funkce na tuto metodu.
- CS8910: Primární konstruktor je v konfliktu s syntetizovaným konstruktorem kopírování.
- CS8958: Konstruktor struktury bez parametrů musí být "public".
- CS8982: Konstruktor deklarovaný v seznamu parametrů musí mít inicializátor "this", který volá primární konstruktor nebo explicitně deklarovaný konstruktor.
- CS8983: Struktura s inicializátory polí musí obsahovat explicitně deklarovaný konstruktor.
- CS9105: V tomto kontextu nelze použít parametr primárního konstruktoru.
- CS9106: Identifikátor je nejednoznačný mezi typem a parametrem v tomto kontextu.
- CS9108: Nelze použít parametr, který má typ podobný odkazu uvnitř anonymní metody, výrazu lambda, výrazu dotazu nebo místní funkce.
-
CS9109: Nelze použít parametr
ref,outneboinprimárního konstruktoru uvnitř člena instance. - CS9110: Nelze použít parametr primárního konstruktoru, který má typ podobný odkazu uvnitř člena instance.
- CS9111: Anonymní metody, výrazy lambda, výrazy dotazu a místní funkce uvnitř člena instance struktury nemohou získat přístup k primární konstruktor parametru.
- CS9112: Anonymní metody, výrazy lambda, výrazy dotazu a místní funkce uvnitř struktury nemohou získat přístup k primárnímu konstruktoru parametru, který se používá také uvnitř člena instance.
- CS9114: Parametru typu jen pro čtení v primárním konstruktoru nelze přiřadit (s výjimkou inicializátoru jen pro inicializaci typu nebo inicializátoru proměnné).
- CS9115: Parametr primárního konstruktoru typu jen pro čtení nelze vrátit zapisovatelným odkazem.
- CS9116: Parametr primárního konstruktoru typu jen pro čtení nelze použít jako ref nebo out hodnotu (s výjimkou inicializátoru pouze pro zápis typu nebo inicializátoru proměnné).
- CS9117: Členy parametrů primárního konstruktoru typu jen pro čtení nelze modifikovat (s výjimkou setteru typu určeného pouze pro inicializaci nebo inicializátoru proměnné).
- CS9118: Členy parametrů primárního konstruktoru typu jen pro čtení nelze vrátit jako zapisovatelný odkaz.
-
CS9119: Členy primárního konstruktoru typu jen pro čtení nelze použít jako hodnotu
refneboout(s výjimkou inicializátoru typu nebo proměnné). - CS9120: Nelze vrátit parametr primárního konstruktoru odkazem.
- CS9121: Parametr primárního konstruktoru struktury typu vyvolává cyklus v struktuře.
- CS9122: Neočekávaný seznam parametrů
- CS9136: Nelze použít parametr primárního konstruktoru typu uvnitř člena instance.
Kromě toho jsou v tomto článku popsána následující upozornění:
- CS0824: Konstruktor „name“ je označen jako externí.
- CS9107: Parametr je zachycen do stavu ohraničujícího typu a jeho hodnota se také předává do základního konstruktoru. Hodnota může být zachycena také základní třídou.
- CS9113: Parametr je nepřečtený.
- CS9124: Parametr je zachycen do stavu ohraničujícího typu a jeho hodnota se také používá k inicializaci pole, vlastnosti nebo události.
- CS9179: Parametr primárního konstruktoru je stínován členem ze základu
- CS9018: Automaticky implementovaná vlastnost se čte před explicitně přiřazenou, což způsobuje předchozí implicitní přiřazení výchozího nastavení.
- CS9019: Pole se čte dříve, než mu byla explicitně přiřazena hodnota, což způsobuje předchozí implicitní přiřazení hodnoty 'default'.
- CS9020: Objekt "this" je přečtený před přiřazením všech jeho polí, což způsobuje předchozí implicitní přiřazení "výchozí" k ne explicitně přiřazeným polím.
- CS9021: Ovládací prvek se vrátí volajícímu před explicitně přiřazenou automaticky implementovanou vlastností, což způsobuje předchozí implicitní přiřazení "default".
- CS9022: Řízení je vráceno volajícímu před explicitním přiřazením pole, což způsobuje předchozí implicitní přiřazení 'výchozí' hodnoty.
Statické konstruktory
- CS0132: Konstruktor: Statický konstruktor musí být bez parametrů.
- CS0514: Statický konstruktor nemůže mít explicitní volání konstruktoru "this" nebo "base".
- CS0515: Modifikátory přístupu nejsou u statických konstruktorů povoleny.
Statické konstruktory inicializují statická data pro typ. Další informace naleznete v tématu Statické konstruktory.
Pokud chcete tyto chyby opravit, ujistěte se, že deklarace statického konstruktoru dodržuje tato pravidla:
- Odeberte všechny parametry z deklarace statického konstruktoru, protože statický konstruktor musí být bez parametrů (CS0132). Pokud potřebujete předat inicializační hodnoty, zvažte použití statických polí nebo vlastností, které jste nastavili před spuštěním statického konstruktoru.
- Odeberte všechny modifikátory přístupu, například
public,protected,privatenebointernalze statického konstruktoru, protože ovládací prvky runtime při spuštění statického konstruktoru a modifikátory přístupu nejsou smysluplné (CS0515). - Odeberte jakákoli volání
: base()inicializátorů konstruktoru nebo: this()ze statického konstruktoru, protože statické konstruktory nemohou zřetězit na jiné konstruktory (CS0514). Modul runtime automaticky vyvolá statický konstruktor základní třídy, pokud existuje.
Deklarace konstruktoru
- CS0526: Rozhraní nemohou obsahovat konstruktory instancí.
- CS0710: Statické třídy nemohou mít konstruktory instance.
- CS8054: Výčty nemohou obsahovat explicitní konstruktory bez parametrů.
- CS8358: Nelze použít konstruktor atributů, protože má parametry in nebo ref readonly.
- CS8091: Konstruktor nemůže být extern a má inicializátor konstruktoru.
- CS8760: "event": extern událost nemůže mít inicializátor.
Konstruktory můžete deklarovat pouze v class a struct typech, včetně record class a record struct typech. Další informace naleznete v tématu Konstruktory instance.
Pokud chcete tyto chyby opravit, vyzkoušejte následující návrhy:
- Přesuňte konstruktor na typ
classnebostruct, protože nelze deklarovat konstruktory v typechinterfaceneboenum(CS0526, CS8054). Rozhraní definují kontrakty, ale neposkytují logiku inicializace a typy výčtů mají své hodnoty definované v době kompilace. - Odeberte instanční konstruktory ze statických tříd, protože statické třídy nelze instancovat a proto nemohou mít instanční konstruktory (CS0710). Pokud potřebujete inicializační logiku, použijte místo toho statický konstruktor.
- Změňte parametry
inneboref readonlyna parametry předávané hodnotou v konstruktorech atributů, protože konstruktory atributů nepodporují modifikátory parametrůinneboref readonly(CS8358). Runtime instancionuje atributy pomocí reflexe, neboť nepodporuje modifikátoryinneboref readonly. - Odeberte inicializátor
: base()nebo: this()z konstruktoruextern, protože externí konstruktory se nemohou řetězit s jinými konstruktory (CS8091). Implementace externího konstruktoru je poskytována externě, takže řetězení konstruktoru není možné. - Odeberte inicializátor z deklarace události
extern(CS8760). Externí události mají přístupové metody add a remove poskytované externím kódem, takže inicializátor pole ve zdrojovém kódu nemá žádný vliv, a proto ho kompilátor nepovoluje.
Pro deklarace konstruktoru lze vygenerovat následující upozornění:
- CS0824: Konstruktor je označen jako externí.
Pokud je konstruktor označen extern, kompilátor nemůže ověřit, zda implementace existuje. Chcete-li toto upozornění potlačit, zadejte implementaci, která není externí, nebo se ujistěte, že je externí implementace správně propojená.
Konstruktory v typech struktur
- CS0568: Struktury nemohou obsahovat explicitní konstruktory bez parametrů.
- CS0573: Deklarace pole: Nemůže mít inicializátory polí instance ve strukturách.
- CS8958: Konstruktor struktury bez parametrů musí být "public".
- CS8982: Konstruktor deklarovaný v seznamu parametrů musí mít inicializátor "this", který volá primární konstruktor nebo explicitně deklarovaný konstruktor.
- CS8983: Struktura s inicializátory polí musí obsahovat explicitně deklarovaný konstruktor.
Typy struktur mají specifická pravidla pro konstruktory a inicializaci polí. Další informace naleznete v části Inicializace struktury a výchozí hodnoty v článku Typy struktur .
Pokud chcete tyto chyby opravit, vyzkoušejte následující návrhy:
- Pokud narazíte na cs0568 nebo CS0573, upgradujte na C# 10 nebo novější, protože k těmto chybám dochází pouze ve starších verzích jazyka C#. Moderní jazyk C# umožňuje explicitní konstruktory bez parametrů a inicializátory polí ve strukturách.
-
publicPřidejte modifikátor přístupu do libovolného konstruktoru struktury bez parametrů, protože konstruktory struktury bez parametrů musí být veřejné, aby bylo zajištěnodefault, že výraz a přidělování polí může správně inicializovat instance struktury (CS8958). - Pro inicializaci u explicitně deklarovaných konstruktorů ve struktuře, která má primární konstruktor, přidejte inicializátor
: this(...), protože všechny konstruktory, které nejsou bezparametrické, musí být zřetězeny k primárnímu konstruktoru nebo k jinému explicitně deklarovanému konstruktoru, aby byla zajištěna konzistentní inicializace (CS8982). - Deklarujte explicitní konstruktor při použití inicializátorů polí, protože kompilátor vyžaduje explicitní konstruktor k zajištění vyvolání inicializátorů polí (CS8983). Tento konstruktor může být konstruktor bez parametrů s prázdným tělem.
Následující upozornění označují, že pole nebo vlastnost nejsou explicitně přiřazeny před čtením nebo před návratem ovládacího prvku volajícímu:
- CS9018: Automaticky implementovaná vlastnost se čte před explicitně přiřazenou, což způsobuje předchozí implicitní přiřazení výchozího nastavení.
- CS9019: Pole se čte před explicitně přiřazeným polem, což způsobuje předchozí implicitní přiřazení výchozí hodnoty.
- CS9020: Objekt "this" je přečtený před přiřazením všech jeho polí, což způsobuje předchozí implicitní přiřazení "výchozí" k ne explicitně přiřazeným polím.
- CS9021: Ovládací prvek se vrátí volajícímu před explicitně přiřazenou automaticky implementovanou vlastností, což způsobuje předchozí implicitní přiřazení "default".
- CS9022: Řízení je vráceno volajícímu před explicitním přiřazením pole, což způsobuje předchozí implicitní přiřazení výchozí hodnoty.
Pokud chcete tato upozornění umlčet, explicitně přiřaďte všechna pole a automaticky implementované vlastnosti před jejich čtením nebo před vrácením ovládacího prvku z konstruktoru (CS9018, CS9019, CS9020, CS9021, CS9022). Při čtení nepřiřazených členů jim kompilátor implicitně přiřazuje default, což není nutně zamýšlené chování.
Volání konstruktoru s base a this
- CS0516: Konstruktor nemůže volat sám sebe.
- CS0517: 'Třída' nemá žádnou bázovou třídu a nemůže volat bázový konstruktor.
- CS0522: Struktury nemohou volat konstruktory základní třídy.
- CS0768: Konstruktor nemůže volat sám sebe prostřednictvím jiného konstruktoru.
- CS1018: Bylo očekáváno klíčové slovo "this" nebo "base".
Pomocí inicializátorů konstruktoru může jeden konstruktor volat jiný konstruktor pomocí : this() nebo : base(). Další informace naleznete v tématu Použití konstruktorů.
Pokud chcete tyto chyby opravit, vyzkoušejte následující návrhy:
- Přerušte všechny řetězy volání cirkulárního konstruktoru, protože konstruktor nemůže volat sám sebe přímo ani nepřímo prostřednictvím jiného konstruktoru (CS0516, CS0768). Ujistěte se, že řetězení konstruktoru nakonec skončí na konstruktoru, který nevolá jiný konstruktor ve stejném typu.
-
: base()Odeberte inicializátor z konstruktorů v typech struktury nebo z konstruktorů v System.Object, protože tyto typy nemají konstruktor základní třídy pro volání (CS0517, CS0522). Typy struktur implicitně dědí z System.ValueType, ale nemůžete explicitně volat jeho konstruktor. - Dokončete inicializátor konstruktoru nebo odeberte dvojtečku (
:) z deklarace konstruktoru, protože když dvojtečka následuje za podpisem konstruktoru, kompilátor očekává buďthis()nebobase()(CS1018). Buď přidejte odpovídající volání konstruktoru, nebo zcela odeberte dvojtečku, pokud není zamýšleno žádné navazování.
Záznamy a kopírovací konstruktory
- CS8867: V základním typu nebyl nalezen žádný přístupný konstruktor kopírování.
- CS8868: Kopírovací konstruktor v záznamu musí volat kopírovací konstruktor základního typu nebo konstruktor bez parametrů, pokud záznam dědí z objektu.
- CS8878: Konstruktor kopírování musí být veřejný nebo chráněný, protože záznam není zapečetěn.
- CS8910: Primární konstruktor je v konfliktu s syntetizovaným konstruktorem kopírování.
V odvozeném typu záznamu musí váš výslovný kopírovací konstruktor volat konstruktor kopírování základního typu pomocí inicializátoru : this(). Pokud záznam přímo dědí z System.Object, může místo toho volat bezparametrový konstruktor objektu (CS8868).
Záznamy zahrnují kopírovací konstruktor syntetizovaný kompilátorem. Můžete napsat explicitní konstruktor kopírování, ale musí splňovat konkrétní požadavky. Kompilátor generuje chyby, když konstruktory záznamu porušují tyto požadavky:
- Základní typ musí mít přístupný konstruktor kopírování. Všechny
recordtypy mají konstruktor kopírování. Ujistěte se, že základní typ jerecord, nebo do něj přidejte přístupný konstruktor kopírování (CS8867). - V odvozeném typu záznamu musí váš výslovný kopírovací konstruktor volat konstruktor kopírování základního typu pomocí inicializátoru
: base(). Pokud záznam přímo dědí z System.Object, může místo toho volat bezparametrový konstruktor objektu (CS8868). - Konstruktory kopírování musí být
publicneboprotectedpokud typ záznamu nenísealed. Přidejte do konstruktoru kopírování odpovídající modifikátor přístupu (CS8878). - Pokud má explicitní konstruktor kopírování stejný podpis jako syntetizovaný konstruktor kopírování, dochází ke konfliktu definic. Odeberte explicitní konstruktor kopírování nebo upravte jeho podpis (CS8910).
Deklarace inicializátoru modulů
- CS8813: Inicializátor modulu musí být běžná metoda člena.
- CS8814: Metoda inicializátoru modulu musí být přístupná na úrovni modulu.
- CS8815: Metoda inicializátoru modulu musí být statická a jiná než virtuální, nesmí mít žádné parametry a musí vracet hodnotu void.
- CS8816: Metoda inicializátoru modulu nesmí být obecná a nesmí být obsažena v obecném typu.
- CS8900: Inicializátor modulu nemůže být atributem UnmanagedCallersOnly.
- CS8901: Metoda je atributem UnmanagedCallersOnly a nelze ji volat přímo. Získejte ukazatel funkce na tuto metodu.
- CS8902: Metoda je atributem UnmanagedCallersOnly a nelze jej převést na typ delegáta. Získejte ukazatel funkce na tuto metodu.
Tyto chyby vynucují požadavky pro metody označené ModuleInitializerAttribute. Inicializátory modulů se spustí automaticky při prvním načtení sestavení před spuštěním jakéhokoli jiného kódu v modulu. Úplná pravidla najdete v tématu Inicializátory modulů.
Pokud chcete tyto chyby opravit, použijte jednu z následujících změn na základě konkrétní diagnostiky:
- Ujistěte se, že je metoda označená
[ModuleInitializer]běžnou metodou, nikoliv přístupem k vlastnostem, přístupem k událostem, místní funkcí, lambdou, konstruktorem, destruktorem nebo operátorem (CS8813). Kompilátor může zacházet pouze s běžnou deklarací metody jako s platným cílem pro infrastrukturu inicializátoru modulu. - Nastavte metodu inicializátoru modulu a všechny její typy
internal, nebopublicproto je metoda přístupná mimo typ nejvyšší úrovně (CS8814). Modul runtime musí volat metodu z vygenerovaného kódu na úrovni modulu, který vyžaduje přístupnost na úrovni modulu. - Deklarujte metodu inicializátoru modulu jako
staticmetodu , která není virtuální, bez parametrů a s návratovým typemvoid(CS8815). Modul runtime volá inicializátory modulu bez argumentů a zahodí výsledek, takže podpis metody musí přesně odpovídat těmto omezením. - Odeberte parametry generického typu z metody inicializátoru modulu a přesuňte tuto metodu z jakéhokoli generického typu, který ji obsahuje (CS8816). Modul runtime nemůže určit, které argumenty typu mají být zadány při vyvolání inicializátoru, takže obecné metody a metody v obecných typech nejsou povolené.
- Odeberte UnmanagedCallersOnlyAttribute z metody inicializátoru modulu (CS8900). Inicializátory modulů jsou volány spravovanou infrastrukturou runtime, takže je nelze omezit pouze na volající z nespravovaného prostředí.
- Místo volání metody označené
[UnmanagedCallersOnly]přímo (CS8901) získejte ukazatel funkce. Metody s atributem UnmanagedCallersOnlyAttribute nelze volat ze spravovaného kódu. Pomocí operátoru&získáte ukazatel funkce (delegate* unmanaged<...>) vunsafekontextu a předejte ukazatel na nespravovaný kód. Pokud váš projekt ještě nepovoluje nebezpečný kód, povolte hoAllowUnsafeBlocks. - Místo převodu metody označené
[UnmanagedCallersOnly]na typ delegáta (CS8902) získejte ukazatel funkce. Metody přiřazené ke spravovaným UnmanagedCallersOnlyAttribute delegátům nelze reprezentovat jako spravované delegáty, protože konvence volání není kompatibilní. Místo toho používejte ukazatele funkce (delegate* unmanaged<...>) vunsafekontextu. Pokud váš projekt ještě nepovoluje nebezpečný kód, povolte hoAllowUnsafeBlocks.
Pro více informací se podívejte na ModuleInitializerAttribute a UnmanagedCallersOnlyAttribute.
Deklarace primárního konstruktoru
Primární konstruktory deklarují parametry přímo v deklaraci typu. Kompilátor syntetizuje pole pro uložení parametru primárního konstruktoru, když ho použijete ve členech nebo inicializátorech polí.
Řetězení konstruktorů
- CS8861: Neočekávaný seznam argumentů
- CS8862: Konstruktor deklarovaný v typu se seznamem parametrů musí mít inicializátor konstruktoru this.
- CS9122: Neočekávaný seznam parametrů
Pokud má typ primární konstruktor, všechny ostatní explicitně deklarované konstruktory se k němu musí zřetězovat pomocí : this(...).
Pokud chcete tyto chyby opravit, vyzkoušejte následující návrhy:
-
: this(...)Přidejte inicializátor, který předá primárnímu konstruktoru odpovídající argumenty, protože všechny explicitně deklarované konstruktory musí být zřetězeny s primárním konstruktorem (CS8862). - Odeberte seznam parametrů z odkazu na základní typ, pokud tento nemá primární konstruktor, protože syntaxe
class Derived : Base(args)je platná pouze tehdy, kdyžBasemá primární konstruktor (CS8861). - Odeberte seznam parametrů primárního konstruktoru
interfacez deklarace, protože rozhraní nemohou mít primární konstruktory (CS9122).
Použití parametrů ve voláních základního konstruktoru
- CS9105: V tomto kontextu nelze použít parametr primárního konstruktoru.
- CS9106: Identifikátor je nejednoznačný mezi typem a parametrem v tomto kontextu.
Parametry primárního konstruktoru můžete použít pouze ve volání základního konstruktoru, pokud je předáte jako součást deklarace primárního konstruktoru.
Pokud chcete tyto chyby opravit, vyzkoušejte následující návrhy:
- Přesuňte použití parametru do základní klauzule deklarace typu namísto jeho použití ve volání explicitně deklarovaného konstruktoru
: base(), protože parametry primárního konstruktoru se mohou objevit pouze v základní klauzuli deklarace typu (CS9105). - Přejmenujte typ nebo parametr, pokud typ a parametr primárního konstruktoru sdílejí stejný název, protože odkaz se stane nejednoznačným (CS9106).
Parametry typu ref-like
- CS9108: Nelze použít parametr, který má typ podobný odkazu uvnitř anonymní metody, výrazu lambda, výrazu dotazu nebo místní funkce.
-
CS9109: Nelze použít
ref,out, neboinparametr primárního konstruktoru uvnitř příslušníka instance. - CS9110: Nelze v instančním členu použít parametr primárního konstruktoru, který má typ podobný ref.
- CS9136: Nelze použít parametr primárního konstruktoru typu uvnitř člena instance.
Pokud chcete tyto chyby vyřešit:
- Parametry primárního konstruktoru typu
ref structmají omezení, kde je můžete použít. Přesuňte přístup k parametrům mimo výrazy lambda, výrazy dotazů nebo místní funkce (CS9108). V typech, které nejsouref struct, můžete přistupovat kref structparametrům pouze v inicializátorech polí nebo v těle konstruktoru, ne v členských funkcích instancí (CS9110, CS9136). - U
ref structtypů nelze použít primární parametry konstruktoru sin,refnebooutmodifikátory v metodách instancí nebo přistupovačů vlastností. Zkopírujte hodnotu parametru do pole v konstruktoru a místo toho použijte toto pole ve členech instance (CS9109).
Omezení typů struktur
- CS9111: Anonymní metody, výrazy lambda, výrazy dotazu a místní funkce uvnitř člena instance struktury nemohou získat přístup k primární konstruktor parametru.
- CS9112: Anonymní metody, výrazy lambda, výrazy dotazu a místní funkce uvnitř struktury nemohou získat přístup k primárnímu konstruktoru parametru, který se používá také uvnitř člena instance.
- CS9120: Nelze vrátit parametr primárního konstruktoru odkazem.
- CS9121: Parametr primárního konstruktoru struktury určitého typu vede k cyklu v rozložení struktury.
Pokud chcete tyto chyby vyřešit:
- V typech struktur nemůžete zachytit parametry primárního konstruktoru ve výrazech lambda, výrazech dotazu nebo místních funkcích uvnitř členů instance. Zkopírujte parametr do místní proměnné nebo pole před jeho použitím v těchto kontextech (CS9111, CS9112).
- Parametry primárního konstruktoru nelze vracet pomocí odkazu v typech struktur. Uložte hodnotu do pole a v případě potřeby ho vraťte odkazem (CS9120).
- Ujistěte se, že typ parametru primárního konstruktoru nevytvoří cyklus v rozložení struktury. Struktura nemůže obsahovat pole vlastního typu buď přímo nebo nepřímo (CS9121).
Omezení struktury pouze pro čtení
- CS9114: Parametr primárního konstruktoru typu jen pro čtení nelze přiřadit (s výjimkou inicializátoru jen pro čtení typu nebo inicializátoru proměnné).
- CS9115: Parametr primárního konstruktoru typu jen pro čtení nelze vrátit zapisovatelným odkazem.
-
CS9116: Primární parametr konstruktoru typu jen pro čtení nelze použít jako
refhodnotu neboouthodnotu (s výjimkou inicializátoru typu nebo inicializace proměnné). - CS9117: Parametry primárního konstruktoru typu jen pro čtení nelze změnit (s výjimkou setteru, který je určen pouze pro inicializaci typu, nebo inicializátoru proměnné).
- CS9118: Členy parametrů primárního konstruktoru typu určeného pouze pro čtení nelze vracet jako zapisovatelný odkaz.
-
CS9119: Parametry primárního konstruktoru typu, který je pouze pro čtení, nelze použít jako
refhodnotu neboouthodnotu (s výjimkou inicializátoru pouze pro zápis tohoto typu nebo inicializátoru proměnné).
Pokud chcete tyto chyby vyřešit:
- V
readonly structtypech nemůžete upravovat parametry primárního konstruktoru a jejich členy mimo inicializátory pouze pro inicializaci nebo inicializátory proměnných. Přesuňte přiřazení k inicializátorům polí nebo nastavením vlastností pouze pro inicializaci (CS9114, CS9117). - Parametry primárního konstruktoru a jejich členy nelze vrátit jako zapisovatelný odkaz u typů
readonly struct. Vrátit podlereadonly refnebo hodnotou (CS9115, CS9118). - Parametry primárního konstruktoru a jejich členy nemůžete předávat jako
refargumenty voutreadonly structtypech. Předejte je podle hodnoty nebo jakoinargumenty (CS9116, CS9119).
Upozornění pro zachycené a stínované parametry
- CS9107: Parametr je zachycen do stavu ohraničujícího typu a jeho hodnota se také předává do základního konstruktoru. Hodnota může být zachycena také základní třídou.
- CS9113: Parametr je nepřečtený.
- CS9124: Parametr je zachycen do stavu ohraničujícího typu a jeho hodnota se také používá k inicializaci pole, vlastnosti nebo události.
- CS9179: Parametr primárního konstruktoru je stínován členem z bázové třídy.
Následující upozornění označují potenciální problémy s ukládáním nebo přístupem k parametrům primárního konstruktoru:
- Parametr můžete uložit dvakrát, pokud ho jak předáte do základního konstruktoru, tak k němu přistupujete v odvozeném typu. Můžete mít jednu kopii v základní třídě a další v odvozené třídě. Zvažte, jestli potřebujete obě kopie nebo restrukturalizovat kód, abyste se vyhnuli duplikaci (CS9107).
- Pokud ho nikdy nečtete, nepotřebujete primární parametr konstruktoru. Odeberte nepoužívané parametry z deklarace primárního konstruktoru (CS9113).
- Parametr můžete uložit dvakrát, pokud ho zachytíte v uzavřeném typu a použijete ho k inicializaci pole, vlastnosti nebo události. Zvažte použití zachyceného parametru přímo místo inicializace samostatného člena (CS9124).
- Člen základního typu stínuje parametr primárního konstruktoru, pokud oba mají stejný název. Přejmenujte parametr tak, aby nedocházelo k nejasnostem (CS9179).