Řešení upozornění souvisejících s využitím oborů názvů
Tento článek se zabývá následujícími chybami kompilátoru:
- CS0138: Chyba: Použití direktivy oboru názvů lze použít pouze na obory názvů; Type je typ, který není oborem názvů.
- CS0431: Chyba: Nelze použít alias identifikátor, protože
::
alias odkazuje na typ. Použijte.
místo toho. - CS0432: Chyba: Alias identifikátor nebyl nalezen.
- CS0576: Chyba: Obor názvů "obor názvů" obsahuje definici v konfliktu s aliasem 'identifier'.
- CS0687: Chyba: Kvalifikátor
::
aliasu oboru názvů se vždy překládá na typ nebo obor názvů, takže je zde neplatný. Místo toho zvažte použití.
. - CS1529: Chyba: Klauzule using musí předcházet všem ostatním prvkům definovaným v oboru názvů kromě deklarací externích aliasů.
- CS1537: Chyba: Dříve v tomto oboru názvů se objevil alias "alias".
- CS7000: Chyba: Neočekávané použití aliasovaného názvu
- CS7007: Chyba: Direktiva
using static
lze použít pouze u typů. Místo toho zvažte direktivuusing namespace
. - CS8083: Chyba: Alias kvalifikovaný název není výraz.
- CS8085: Chyba: K deklaraci aliasu nelze použít direktivu using static.
- CS8914: Chyba: Globální direktivu using nelze použít v deklaraci oboru názvů.
- CS8915: Chyba: Globální direktiva using musí předcházet všem ne globálním direktivě using.
- CS9055: Chyba: Místní typ souboru nelze použít v globální direktivě using static.
- CS9130: Chyba: Použití aliasu
ref
nemůže být typ. - CS9131: Chyba: Pouze alias using může být
unsafe
. - CS9132: Chyba: Použití aliasu nemůže být typu odkazu s možnou hodnotou null.
- CS9133: Chyba:
static
Modifikátor musí předcházetunsafe
modifikátoru. - CS9162: Typ není platný pro použití statického typu. Lze použít pouze třídu, strukturu, rozhraní, výčt, delegát nebo obor názvů.
A následující upozornění kompilátoru:
- CS0105: Upozornění: Direktiva using pro obor názvů se objevila dříve v tomto oboru názvů.
- CS0440: Upozornění: Definování pojmenovaného
global
aliasu je špatně doporučeno, protožeglobal::
vždy odkazuje na globální obor názvů, nikoli alias. - CS8019: Informace: Nepotřebné použití direktivy.
- CS8933: Informace: Direktiva using se dříve objevila jako globální použití.
Tyto chyby a upozornění značí, že using
direktiva není správně vytvořená. Následující části obsahují informace o těchto chybách a jejich opravě.
Using – direktiva
Direktiva using
musí předcházet jakýmkoli jiným prvkům namespace
v deklaraci nebo před všemi namespace
deklaracemi v souboru. using
Pozdější vložení direktivy do souboru způsobí, že kompilátor vytvoří chybu CS1529:
namespace UsingDirective;
public class MyClass
{
}
using System.Text.Json; // CS1529
Pokud chcete tento problém vyřešit, přesuňte všechny using
deklarace na začátek souboru nebo do horní části oboru názvů:
using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}
Kompilátor generuje upozornění CS8933, CS0105 nebo diagnostická CS8019 pro duplicitní using
direktivu using
z nebo global using
direktivy. Můžete odebrat všechny duplicity.
Nesprávné kombinování direktivy s direktivou using
static
, global
nebo unsafe
modifikátory direktivy using
jsou popsány dále v tomto článku.
Použití statické direktivy
Direktiva using static
naimportuje členy jednoho typu do aktuálního oboru názvů. Následující příklad naimportuje metody z System.Console
, například WriteLine
do aktuálního oboru názvů:
using static System.Console;
Kompilátor vygeneruje CS0138 , pokud vynecháte static
modifikátor:
using System.Console; // CS0138
Kompilátor vygeneruje CS7007 , pokud zahrnete static
modifikační import oboru názvů místo typu:
using static System; // CS7007
Kompilátor generuje CS9162, pokud symbol není jedním z správných typů.
Pokud modifikátor zkombinujete static
s modifikátorem unsafe
v direktivě using
, static
musí modifikátor přijít jako první:
using static unsafe UnsafeExamples.UnsafeType;
Globální direktiva using
Direktiva global using
importuje obor názvů nebo typ ve všech zdrojových souborech v aktuálním projektu:
global using System.Text;
Všechny global using
direktivy musí v daném zdrojovém souboru předcházet všem jiným než globálním using
direktivě a nesmí být umístěny do složky namespace
. Výsledkem je cs8915 a CS8914.
Kromě toho static global using
direktiva nemůže odkazovat na místní typ souboru.
Kvalifikátor aliasů
Kvalifikátor aliasu, ::
předchází aliasu oboru názvů nebo se řídí aliasem global
. Pokud použijete ::
místo, kde .
byste měli použít k oddělení prvků plně kvalifikovaného názvu, kompilátor vygeneruje jeden z CS0431, CS0432, CS0687, *CS7000 nebo CS8083.
Ve všech případech nahraďte ::
oddělovačem .
.
Kromě toho, pokud definujete alias s názvem global
, kompilátor vydá CS0440. Alias global
vždy odkazuje na globální obor názvů. Deklarování aliasu pro něj nefunguje a měli byste pro svůj alias vybrat jiný název.
Konflikty názvů aliasů
Alias můžete deklarovat pro obor názvů nebo typ pomocí direktivyusing
:
using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);
Měli byste se pokusit vytvořit jedinečný název aliasu =
, název nalevo od přihlášení v předchozích příkladech. Použití názvu, který se už mapuje na typ (například Object
) nebo obor názvů (System
) může způsobit CS0576 nebo CS1537.
Omezení používání aliasů
Před C# 12 jazyk uložil tato omezení direktiv using
, které vytvářejí alias pro deklaraci typu:
Nemůžete vytvořit alias se direktivou
using static
:using static con = System.Console; using static unsafe ip = int*;
Počínaje jazykem C# 12 se zavádějí tato omezení:
V aliasu
in
using nemůžete použít modifikátory ,ref
aniout
modifikátory:// All these are invalid using RefInt = ref int; using OutInt = out int; using InInt = in int;
Direktiva
unsafe using
musí zadat alias nebostatic using
:// Elsewhere: public namespace UnsafeExamples { public unsafe static class UnsafeType { // ... } } // Using directives: using unsafe IntPointer = int*; using static unsafe UnsafeExamples.UnsafeType; using unsafe UnsafeExamples; // not allowed
Nemůžete vytvořit alias pro typ odkazu s možnou hodnotou null:
using NullableInt = System.Int32?; // Allowed using NullableString = System.String?; // Not allowed