Dela via


Lösa varningar som rör användning av namnområden

Den här artikeln beskriver följande kompilatorfel:

  • CS0138: Error: A using namespace directive can only be applied to namespaces; "type" är en typ som inte är ett namnområde.
  • CS0431: Fel: Det går inte att använda aliaset "identifierare" med :: eftersom aliaset refererar till en typ. Använd . i stället.
  • CS0432: Fel: Aliaset "identifierare" hittades inte.
  • CS0576: Fel: Namnområdets namnområde innehåller en definition som är i konflikt med aliaset "identifierare".
  • CS0687: Fel: Namnområdesaliaskvalificeraren :: matchar alltid en typ eller ett namnområde, så det är inte tillåtet här. Överväg att använda . i stället.
  • CS1529: Fel: En användningssats måste föregå alla andra element som definierats i namnområdet förutom externa aliasdeklarationer.
  • CS1537: Fel: Aliaset "alias" visades tidigare i det här namnområdet.
  • CS7000: Fel: Oväntad användning av ett aliasnamn.
  • CS7007: Fel: Ett using static direktiv kan endast tillämpas på typer. Överväg ett using namespace direktiv i stället
  • CS8083: Fel: Ett aliasbevalt namn är inte ett uttryck.
  • CS8085: Fel: Ett "använda statiskt" direktiv kan inte användas för att deklarera ett alias.
  • CS8914: Fel: Ett globalt användningsdirektiv kan inte användas i en namnområdesdeklaration.
  • CS8915: Fel: Ett globalt användningsdirektiv måste föregå alla icke-globala användningsdirektiv.
  • CS9055: Fel: En fillokal typ kan inte användas i ett "globalt med statiskt" direktiv.
  • CS9130: Fel: Användning av alias kan inte vara en ref typ.
  • CS9131: Fel: Endast ett använda alias kan vara unsafe.
  • CS9132: Fel: Användning av alias kan inte vara en referenstyp som kan ogiltigförklaras.
  • CS9133: Fel: static modifieraren måste föregå unsafe modifieraren.
  • CS9162: Typen är inte giltig för "användning av statisk". Endast en klass, struct, gränssnitt, uppräkning, ombud eller namnrymd kan användas.

Och följande kompilatorvarningar:

  • CS0105: Varning: Användningsdirektivet för "namnområde" visades tidigare i det här namnområdet.
  • CS0440: Varning: Det är inte klokt att definiera ett alias med namnet global eftersom global:: det alltid refererar till det globala namnområdet och inte ett alias.
  • CS8019: Info: Onödig användning av direktiv.
  • CS8933: Info: Användningsdirektivet visades tidigare som global användning.

Dessa fel och varningar indikerar att du är ett direktiv som inte har skapats using korrekt. Följande avsnitt beskriver dessa fel och hur du korrigerar dem.

Använda direktiv

Direktivet using måste föregå andra element i en namespace deklaration eller före eventuella namespace deklarationer i filen. Om du lägger till ett using direktiv senare i filen genereras felet CS1529 av kompilatorn:

namespace UsingDirective;
public class MyClass
{
}

using System.Text.Json; // CS1529

Åtgärda problemet genom att flytta eventuella using deklarationer överst i filen eller överst i namnområdet:

using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}

Kompilatorn genererar varning cs8933, CS0105 eller diagnostik CS8019 för ett duplicerat using direktiv från ett using eller global using ett direktiv. Du kan ta bort eventuella dubbletter.

En felaktig kombination av ett using direktiv med static, globaleller unsafe modifierare för ett using direktiv beskrivs senare i den här artikeln.

Använda statiskt direktiv

Direktivet using static importerar en typs medlemmar till det aktuella namnområdet. I följande exempel importeras metoderna från System.Console, till exempel WriteLine till det aktuella namnområdet:

using static System.Console;

Kompilatorn genererar CS0138 om du utelämnar static modifieraren:

using System.Console; // CS0138

Kompilatorn genererar CS7007 om du inkluderar static den modifierare som importerar namnområdet i stället för en typ:

using static System; // CS7007

Kompilatorn genererar CS9162 om symbolen inte är någon av rätt typer.

Om du kombinerar static modifieraren med unsafe modifieraren i ett using direktiv static måste modifieraren komma först:

using static unsafe UnsafeExamples.UnsafeType;

Globalt användningsdirektiv

Ett global using direktiv importerar namnområdet eller skriver in alla källfiler i det aktuella projektet:

global using System.Text;

Alla global using direktiv måste föregå alla icke-globala using direktiv i källfilen och får inte placeras i en namespace. Detta resulterar i CS8915respektive CS8914.

Dessutom kan ett static global using direktiv inte referera till en fillokal typ.

Aliaskval

Aliaskvalificeraren, ::, föregår ett namnområdesalias eller följer aliaset global . Om du använder :: var . ska användas för att avgränsa element med ett fullständigt kvalificerat namn genererar kompilatorn en av CS0431, CS0432, CS0687, *CS7000 eller CS8083.

Ersätt i alla fall :: med . avgränsaren.

Om du definierar ett alias med namnet globalutfärdar kompilatorn dessutom CS0440. Aliaset global refererar alltid till det globala namnområdet. Att deklarera ett alias för det fungerar inte och du bör välja ett annat namn för ditt alias.

Aliasnamnkonflikter

Du kan deklarera ett alias till ett namnområde eller en typ med ett using direktiv:

using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);

Du bör försöka skapa ett unikt namn för aliaset, namnet till vänster om = tecknet i föregående exempel. Om du använder ett namn som redan mappas till en typ (till exempel Object) eller ett namnområde (System) kan det orsaka CS0576 eller CS1537.

Begränsningar för användning av alias

Före C# 12 införde språket dessa begränsningar för using direktiv som skapar ett alias för en typdeklaration:

  • Du kan inte skapa ett alias med ett using static direktiv:

    using static con = System.Console;
    using static unsafe ip = int*;
    

Från och med C# 12 införs dessa begränsningar:

  • Du kan inte använda inmodifierarna , refeller out i ett alias:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • Ett unsafe using direktiv måste ange ett alias eller ett 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
    
  • Du kan inte skapa ett alias till en nullbar referenstyp:

    using NullableInt = System.Int32?; // Allowed
    using NullableString = System.String?; // Not allowed