Sdílet prostřednictvím


Ř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 direktivu using 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ázet unsafe 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že global:: 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 usingstatic, globalnebo 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 inusing nemůžete použít modifikátory , refani out modifikátory:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • Direktiva unsafe using musí zadat alias nebo static 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