Udostępnij przez


Rozwiązywanie problemów związanych z ostrzeżeniami przy użyciu przestrzeni nazw

W tym artykule opisano następujące błędy kompilatora:

  • CS0138: Błąd: Dyrektywa using namespace może być stosowana tylko do przestrzeni nazw; "type" to typ, który nie jest przestrzenią nazw.
  • CS0431: Błąd: Nie można użyć aliasu "identifier" z :: odkąd alias odwołuje się do typu. Zamiast tego użyj polecenia . .
  • CS0432: Błąd: Nie znaleziono aliasu "identyfikatora".
  • CS0576: Błąd: przestrzeń nazw "przestrzeń nazw" zawiera definicję powodującą konflikt z aliasem "identifier".
  • CS0687: Błąd: kwalifikator :: aliasu przestrzeni nazw zawsze jest rozpoznawany jako typ lub przestrzeń nazw, dlatego jest tutaj niedozwolony. Rozważ użycie . zamiast tego.
  • CS1529: Błąd: Klauzula using musi poprzedzać wszystkie inne elementy zdefiniowane w przestrzeni nazw z wyjątkiem deklaracji aliasu extern.
  • CS1537: Błąd: alias using "alias" pojawił się wcześniej w tej przestrzeni nazw.
  • CS7000: Błąd: Nieoczekiwane użycie nazwy aliasu.
  • CS7007: Błąd: using static Dyrektywa może być stosowana tylko do typów. Rozważ zamiast tego dyrektywę using namespace
  • CS8083: Błąd: nazwa kwalifikowana aliasu nie jest wyrażeniem.
  • CS8085: Błąd: nie można użyć dyrektywy "using static" do deklarowania aliasu.
  • CS8914: Błąd: nie można użyć globalnej dyrektywy using w deklaracji przestrzeni nazw.
  • CS8915: Błąd: globalna dyrektywa using musi poprzedzać wszystkie dyrektywy nienależące do użycia globalnego.
  • CS9055: Błąd: nie można użyć typu pliku lokalnego w dyrektywie "global using static".
  • CS9130: Błąd: Używanie aliasu nie może być typem ref .
  • CS9131: Błąd: tylko alias używany może być unsafe.
  • CS9132: Błąd: Używanie aliasu nie może być typem odwołania dopuszczanym do wartości null.
  • CS9133: Błąd: static modyfikator musi poprzedzać unsafe modyfikator.
  • CS9162: Typ jest nieprawidłowy dla "używanie statycznego". Można użyć tylko klasy, struktury, interfejsu, wyliczenia, delegata lub przestrzeni nazw.

A następujące ostrzeżenia kompilatora:

  • CS0105: Ostrzeżenie: dyrektywa using dla "przestrzeni nazw" pojawiła się wcześniej w tej przestrzeni nazw.
  • CS0440: Ostrzeżenie: Definiowanie aliasu o nazwie global jest nieodpowiednie, ponieważ global:: zawsze odwołuje się do globalnej przestrzeni nazw, a nie aliasu.
  • CS8019: Informacje: Niepotrzebne używanie dyrektywy.
  • CS8933: Informacje: dyrektywa using pojawiła się wcześniej jako globalna.

Te błędy i ostrzeżenia wskazują using , że dyrektywa nie jest poprawnie sformułowana. W poniższych sekcjach opisano te błędy i sposób ich poprawiania.

Korzystanie z dyrektywy

Dyrektywa using musi poprzedzać wszelkie inne elementy w namespace deklaracji lub przed wszelkimi namespace deklaracjami w pliku. using Umieszczenie dyrektywy w dalszej części pliku powoduje, że kompilator generuje błąd CS1529:

namespace UsingDirective;
public class MyClass
{
}

using System.Text.Json; // CS1529

Aby rozwiązać ten problem, przenieś wszelkie using deklaracje na górę pliku lub górę przestrzeni nazw:

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

Kompilator generuje ostrzeżenie CS8933, CS0105 lub diagnostic CS8019 dla zduplikowanej using dyrektywy z using dyrektywy or global using . Można usunąć wszelkie duplikaty.

Niepoprawne połączenie using dyrektywy z modyfikatorami using staticglobal, lub unsafe dyrektywy opisano w dalszej części tego artykułu.

Używanie dyrektywy statycznej

Dyrektywa using static importuje jeden typ elementów członkowskich do bieżącej przestrzeni nazw. Poniższy przykład importuje metody z System.Consoleprogramu , takie jak WriteLine do bieżącej przestrzeni nazw:

using static System.Console;

Kompilator generuje CS0138 , jeśli pominięto static modyfikator:

using System.Console; // CS0138

Kompilator generuje cs7007 , jeśli zamiast typu uwzględnisz static modyfikator importujący przestrzeń nazw:

using static System; // CS7007

Kompilator emituje CS9162, jeśli symbol nie jest jednym z odpowiednich typów.

W przypadku połączenia static modyfikatora z unsafe modyfikatorem using w dyrektywie static modyfikator musi być najpierw:

using static unsafe UnsafeExamples.UnsafeType;

Globalna dyrektywa using

global using Dyrektywa importuje przestrzeń nazw lub typ we wszystkich plikach źródłowych w bieżącym projekcie:

global using System.Text;

Wszystkie global using dyrektywy muszą poprzedzać wszelkie dyrektywy inne niż globalne using w tym pliku źródłowym namespacei nie mogą być umieszczane w pliku . W ten sposób wyniki są odpowiednio w cs8915 i CS8914.

Ponadto static global using dyrektywa nie może odwoływać się do typu lokalnego pliku.

Kwalifikator aliasów

Kwalifikator aliasu , ::poprzedza alias przestrzeni nazw lub jest zgodny z aliasem global . Jeśli używasz :: metody , gdzie . należy używać do oddzielania elementów w pełni kwalifikowanej nazwy, kompilator emituje jeden z CS0431, CS0432, CS0687, *CS7000 lub CS8083.

We wszystkich przypadkach zastąp :: element separatorem . .

Ponadto jeśli zdefiniujesz alias o nazwie global, kompilator wystawia plik CS0440. Alias global zawsze odwołuje się do globalnej przestrzeni nazw. Deklarowanie aliasu nie działa i należy wybrać inną nazwę aliasu.

Konflikty nazw aliasów

Alias można zadeklarować w przestrzeni nazw lub typie z dyrektywąusing:

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

Spróbuj utworzyć unikatową nazwę aliasu, nazwę po lewej stronie = logowania w poprzednich przykładach. Użycie nazwy, która jest już mapowania na typ (na przykład Object) lub przestrzeń nazw (System) może spowodować CS0576 lub CS1537.

Ograniczenia dotyczące używania aliasów

Przed językiem C# 12 język nakładał te ograniczenia na using dyrektywy, które tworzą alias dla deklaracji typu:

  • Nie można utworzyć aliasu z dyrektywą using static :

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

Począwszy od języka C# 12, wprowadzono następujące ograniczenia:

  • Nie można użyć inmodyfikatorów , refani out w aliasie:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • unsafe using Dyrektywa musi określać alias lub :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
    
  • Nie można utworzyć aliasu dla typu odwołania dopuszczanego do wartości null:

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