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:
- CS0193: Operátor * nebo -> musí být použit u ukazatele dat.
- CS0196: Ukazatel musí být indexován pouze jednou hodnotou.
- CS0208: Nelze převzít adresu, získat velikost nebo deklarovat ukazatel na spravovaný typ ('typ')
- CS0209: Typ lokálního deklarovaného v pevném příkazu musí být typ ukazatele.
-
CS0210: Inicializátor musíte zadat v deklaraci pevného nebo
usingpříkazu. - CS0211: Nelze vzít adresu daného výrazu.
- CS0212: Adresu nefixovaného výrazu můžete převzít pouze uvnitř inicializátoru pevného příkazu.
- CS0213: Nemůžete použít příkaz fixed k získání adresy již zafixovaného výrazu.
- CS0214: Ukazatele a vyrovnávací paměti s pevnou velikostí lze použít pouze v nebezpečném kontextu
- CS0227: Nebezpečný kód se může zobrazit pouze při kompilaci s /nebezpečným
- CS0233: Identifikátor nemá předdefinovanou velikost, proto lze velikost použít pouze v nebezpečném kontextu.
- CS0242: Operace, která je dotčená, není definována u ukazatelů void
-
CS0244: Na typech ukazatelů není platné "
is' ani 'as' - CS0254: Pravá strana přiřazení ve fixním příkazu nesmí být výraz přetypování
- CS0459: Nelze převzít adresu místní proměnné jen pro čtení
- CS0821: Implicitně zadané místní hodnoty nelze opravit.
- CS1641: Pole vyrovnávací paměti s pevnou velikostí musí mít specifikátor velikosti pole za názvem pole.
- CS1642: Pole vyrovnávací paměti s pevnou velikostí mohou být pouze členy struktur.
- CS1656: Nelze přiřadit proměnné, protože se jedná o typ proměnné jen pro čtení.
-
CS1663: Typ vyrovnávací paměti s pevnou velikostí musí být jeden z následujících:
bool,byte,short,int,long,char,sbyte,ushort,uint,ulong,floatnebodouble - CS1665: Buffery s pevnou velikostí musí mít délku větší než nula
- CS1666: Nelze použít vyrovnávací paměti pevné velikosti obsažené v opravených výrazech. Zkuste použít pevný příkaz.
- CS1708: Vyrovnávací paměti s pevnou velikostí lze přistupovat pouze přes místní hodnoty nebo pole.
-
CS1716: Nepoužívejte atribut '
System.Runtime.CompilerServices.FixedBuffer'. Místo toho použijte modifikátor pevného pole. - CS1919: Při vytváření objektu nelze použít nebezpečný typ "název typu".
-
CS4004: Nelze
awaitv nebezpečném kontextu -
CS8812: Nelze převést
&Methodskupinu na typ ukazatele mimo funkci. -
CS9123: Operátor '
&' by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách.
Operace ukazatele a dereferencování
-
CS0193: Operátor
*nebo->musí být použit u datového ukazatele - CS0196: Ukazatel musí být indexován pouze jednou hodnotou.
- CS0242: Operace, která je dotčená, není definována u ukazatelů void
Pokud chcete správně používat operace ukazatele, postupujte podle pravidel pro dereferencování, indexování a aritmetické operace. Další informace naleznete v tématu Typy ukazatelů a ukazatele funkce.
- Použití operátoru
*nebo->pouze u datových ukazatelů (CS0193). Nepoužívejte tyto operátory s neukazatelovými typy ani s ukazateli na funkce. Ukazatele funkcí nelze v jazyce C# dereferencovat, na rozdíl od C/C++. - Indexové ukazatele s pouze jednou hodnotou (CS0196). U ukazatelů se nepodporuje vícerozměrné indexování.
- Vyhněte se operacím, které nejsou definovány u ukazatelů void (CS0242). Například nezvýšujte ukazatel void, protože kompilátor nezná velikost dat, na která odkazují.
Typy ukazatelů a spravované typy
- CS0208: Nelze převzít adresu, získat velikost nebo deklarovat ukazatel na spravovaný typ ('typ')
- CS0233: Identifikátor nemá předdefinovanou velikost, proto lze velikost použít pouze v nebezpečném kontextu.
Pokud chcete pracovat s ukazateli a operátorem sizeof správně, použijte nespravované typy a správné kontexty. Další informace naleznete v tématu Nespravované typy a sizeof operátor.
- Používejte ukazatele pouze u nespravovaných typů (CS0208). Neurčujte adresu, nezjišťujte velikost ani nedeklarujte ukazatele na spravované typy. Spravované typy zahrnují odkazové typy a struktury, které obsahují pole nebo vlastnosti typu odkazu.
-
sizeofOperátor použijte vunsafekontextu při práci s typy, jejichž velikost není konstanta kompilačního času (CS0233).
Pevné vyrovnávací paměti
- CS0209: Typ místního deklarovaného v pevném příkazu musí být typ ukazatele.
-
CS0210: Inicializátor musíte zadat v deklaraci pevného nebo
usingpříkazu. - CS0211: Nelze vzít adresu daného výrazu.
- CS0212: Adresu nefixovaného výrazu můžete převzít pouze uvnitř inicializátoru pevného příkazu.
- CS0213: Pevný výraz nelze použít k zjištění adresy již pevného výrazu.
- CS0254: Pravá strana přiřazení pevného příkazu nemusí být výraz přetypování
- CS0459: Nelze převzít adresu místní proměnné jen pro čtení
- CS0821: Implicitně zadané místní hodnoty nelze opravit.
- CS1656: Nelze přiřadit proměnné, protože se jedná o typ proměnné jen pro čtení.
K těmto chybám dochází při nesprávném fixed použití příkazu . Příkaz fixed zabraňuje, aby správce paměti přesunul přesunovatelnou proměnnou, a deklaruje ukazatel na danou proměnnou. Další informace naleznete v tématu Nebezpečný kód a ukazatele.
Správné použití fixed příkazu:
- Deklarujte proměnnou jako typ ukazatele (CS0209).
- Zadejte inicializátor v
fixeddeklaraci příkazu (CS0210). - Vezměte adresu pouze platných výrazů: pole, místní proměnné a nepřímý ukazatel (CS0211). Nepřebírejte adresu počítaných výrazů, jako součtu dvou proměnných.
- Používejte operátor "address-of" u nefixovaných výrazů pouze v inicializátoru příkazu
fixed(CS0212). - Nepoužívejte
fixedpříkaz u již pevných výrazů (CS0213). Místní proměnné a parametry vunsafemetodě jsou již pevně umístěny na zásobníku. - Nepoužívejte výrazy přetypování na pravé straně
fixedpřiřazení příkazu (CS0254). - Neberte adresu místních proměnných určených jen pro čtení (CS0459). Proměnné ve
foreachsmyčkách,usingpříkazech afixedpříkazech jsou jen pro čtení. - Místo
varv příkazechfixedpoužívejte explicitní typy (CS0821). - Nepřiřazujte proměnné v kontextech jen pro čtení, jako jsou
foreachsmyčky,usingpříkazy nebofixedpříkazy (CS1656).
Nebezpečná omezení kontextu
- CS0214: Ukazatele a vyrovnávací paměti s pevnou velikostí lze použít pouze v nebezpečném kontextu
- CS0227: Nebezpečný kód se může zobrazit pouze při kompilaci s /nebezpečným
- CS0244: Na typech ukazatelů není "is" ani "as" platný.
- CS1919: Při vytváření objektu nelze použít nebezpečný typ "název typu".
- CS4004: Nelze použít 'await' v nebezpečném kontextu
- CS9123: Operátor &by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách.
K těmto chybám dochází při použití nebezpečných konstruktorů kódu bez správného nebezpečného kontextu nebo při pokusu o operace, které nejsou povoleny v nebezpečném kódu. Další informace naleznete v tématu Nebezpečný kód a ukazatele a unsafe klíčové slovo.
Správné použití nebezpečného kódu:
- Označte metody, typy nebo bloky kódu, které používají ukazatele nebo vyrovnávací paměti s pevnou velikostí, pomocí klíčového
unsafeslova (CS0214). - Povolte v nastavení projektu možnost kompilátoru AllowUnsafeBlocks při použití klíčového slova
unsafe(CS0227). - Nepoužívejte operátory
isaniass typy ukazatelů (CS0244). Tyto operátory testování typů nejsou platné pro ukazatele. - Nepoužívejte
newoperátor k vytvoření instancí typu ukazatele (CS1919). Chcete-li vytvořit objekty v nespravované paměti, použijte interop k volání nativních metod, které vracejí ukazatele. - Udržujte nebezpečný kód odděleně od asynchronního kódu (CS4004). Vytvořte samostatné metody pro nebezpečné operace a volejte je z asynchronních metod.
- Nepoužívejte operátor address-of (
&) u parametrů nebo místních proměnných v asynchronních metodách (CS9123). Po dokončení asynchronní operace nemusí proměnná existovat.
Vyrovnávací paměti s pevnou velikostí
- CS1641: Pole s pevnou velikostí musí mít specifikátor velikosti pole za názvem pole.
- CS1642: Pole vyrovnávací paměti s pevnou velikostí mohou být pouze členy struktur.
- CS1663: Typ bufferu pevné velikosti musí být jeden z následujících: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float nebo double
- CS1665: Vyrovnávací paměti s pevnou velikostí musí mít délku větší než nula
- CS1666: Nelze použít vyrovnávací paměti pevné velikosti obsažené v opravených výrazech. Zkuste použít pevný příkaz.
- CS1708: Vyrovnávací paměti s pevnou velikostí lze přistupovat pouze přes místní hodnoty nebo pole.
- CS1716: Nepoužívejte atribut System.Runtime.CompilerServices.FixedBuffer. Místo toho použijte modifikátor pevného pole.
K těmto chybám dochází při práci s vyrovnávacími paměťmi s pevnou velikostí. Pevně velikostní buffery jsou pole vložená přímo do struktur a primárně se používají pro případy spolupráce. Další informace naleznete v tématu Vyrovnávací paměti s pevnou velikostí.
Chcete-li deklarovat a používat vyrovnávací paměti s pevnou velikostí správně:
- Zadejte velikost pole za názvem pole pomocí kladné celočíselné konstanty (CS1641, CS1665).
- Deklarujte vyrovnávací paměti s pevnou velikostí pouze ve strukturách, ne ve třídách (CS1642). Pokud potřebujete pole ve třídě, použijte běžné pole.
- Použijte jeden z podporovaných typů prvků:
bool,byte,short,int,long,char,sbyte, ,ushort,uint,ulongfloatnebodouble(CS1663). - Před přístupem ke vyrovnávací paměti (CS1666) použijte příkaz na připnutí struktury, která ji obsahuje.
- Při přístupu k vyrovnávacím pamětím s pevnou velikostí používejte pouze lokální proměnné nebo pole, nikoli zprostředkující výrazy (CS1708).
- Místo atributu
fixedSystem.Runtime.CompilerServices.FixedBuffer(CS1716) použijte modifikátor pole.
Ukazatelé funkcí
-
CS8812: Nelze převést
&Methodskupinu na typ ukazatele mimo funkci
Pokud chcete získat ukazatel funkce, použijte operátor address-of s explicitním přetypování typu ukazatele funkce. Nepoužívejte operátor adresování & k přiřazení skupin metod k void* nebo jiným typům, které nejsou ukazateli na funkce. Další informace naleznete v tématu Ukazatele funkce.