Behandeln von Warnungen im Zusammenhang mit Namespaces

In diesem Artikel werden die folgenden Compilerfehler behandelt:

  • CS0138: Fehler: Eine „using“-Namespaceanweisung kann nur auf Namespaces angewandt werden. „type“ ist ein Typ und kein Namespace.
  • CD0431: Fehler: Der Alias „Bezeichner“ kann nicht mit :: verwendet werden, da der Alias auf einen Typ verweist. Verwenden Sie stattdessen ..
  • CS0432: Fehler: Der Alias „Bezeichner“ wurde nicht gefunden.
  • CS0576: Fehler: Der Namespace „Namespace“ enthält eine Definition, die mit dem Alias „Bezeichner“ in Konflikt steht.
  • CS0687: Fehler: Der Qualifizierer :: für den Namespacealias wird immer zu einem Typ oder Namespace aufgelöst und ist somit an dieser Stelle ungültig. Erwägen Sie stattdessen die Verwendung von ..
  • CS1529: Fehler: Eine „using“-Klausel muss allen anderen im Namespace definierten Elementen vorangehen, mit Ausnahme externer Aliasdeklarationen.
  • CS1537: Fehler: Der „using“-Alias „alias“ ist bereits vorgängig in diesem Namespace aufgetreten.
  • CS7000: Fehler: Unerwartete Verwendung eines Aliasnamens.
  • CS7007: Fehler: Eine using static-Anweisung kann nur auf Typen angewendet werden. Erwägen Sie stattdessen eine using namespace-Anweisung
  • CS8083: Fehler: Ein „alias“-qualifizierter Name ist kein Ausdruck.
  • CS8085: Fehler: Eine „using static“-Anweisung kann nicht zum Deklarieren eines Alias verwendet werden.
  • CS8914: Fehler: Eine „global using“-Anweisung kann nicht in einer Namespacedeklaration verwendet werden.
  • CS8915: Fehler: Eine „global using“-Anweisung muss allen nicht-“global using“-Anweisungen vorangehen.
  • CS9055: Fehler: Ein dateilokaler Typ kann nicht in einer „global using static“-Anweisung verwendet werden.
  • CS9130: Fehler: Der „using“-Alias darf nicht vom Typ ref sein.
  • CS9131: Fehler: Nur ein „using“-Alias darf unsafe sein.
  • CS9132: Fehler: Der „using“-Alias darf kein Nullable-Verweistyp sein.
  • CS9133: Fehler: Der Modifizierer static muss dem Modifizierer unsafe vorangestellt sein.
  • CS9162: Typ ist für „using static“ ungültig. Es kann nur eine Klasse, Struktur, Schnittstelle, Enumeration, Delegat oder Namespace verwendet werden.

Und die folgenden Compilerwarnungen:

  • CS0105: Warnung: Die „using“-Anweisung für „namespace“ ist bereits vorher in diesem Namespace aufgetreten.
  • CS0440: Warnung: Es sollte kein Alias mit dem Namen global definiert werden, da global:: immer ein Verweis auf den globalen Namespace und nicht auf einen Alias ist.
  • CS8019: Information: Nicht erforderliche „using“-Anweisung.
  • CS8933: Information: Die „using“-Anweisung wurde zuvor bereits als „global using“ verwendet.

Diese Fehler und Warnungen deuten darauf hin, dass die using-Anweisung nicht korrekt ist. In den folgenden Abschnitten werden diese Fehler und deren Behebung behandelt.

using-Anweisung

Die using-Anweisung muss vor allen anderen Elementen in einer namespace-Deklaration oder vor allen namespace-Deklarationen in der Datei stehen. Wenn Sie eine using-Anweisung später einfügen, generiert der Compiler den Fehler CS1529:

namespace UsingDirective;
public class MyClass
{
}

using System.Text.Json; // CS1529

Um dieses Problem zu beheben, verschieben Sie alle using-Deklarationen an den Anfang der Datei oder an den Anfang des Namespace:

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

Der Compiler generiert die Warnung CS8933, CS0105 oder CS8019 für eine doppelte using-Anweisung aus einer using- oder global using-Anweisung. Duplikate können entfernt werden.

Informationen zu Fehlern bei der Kombination einer using-Anweisung mit den Modifizierern static, global oder unsafe in einer using-Anweisung finden Sie weiter unten in diesem Artikel.

„using static“-Anweisung

Die using static-Anweisung importiert die Member eines Typs in den aktuellen Namespace. Im folgenden Beispiel werden die Methoden aus System.Console (z. B. WriteLine) in den aktuellen Namespace importiert:

using static System.Console;

Der Compiler generiert den Fehler CS0138, wenn Sie den Modifizierer static weglassen:

using System.Console; // CS0138

Der Compiler generiert den Fehler CS7007, wenn Sie anstelle eines Typs den Modifizierer static für den importierten Namespace einschließen:

using static System; // CS7007

Der Compiler gibt CS9162 aus, wenn das Symbol keiner der richtigen Typen ist.

Wenn Sie den Modifizierer static mit dem Modifizierer unsafe in einer using-Anweisung kombinieren, muss der Modifizierer static zuerst angegeben werden:

using static unsafe UnsafeExamples.UnsafeType;

Globale using-Anweisung

Eine global using-Anweisung importiert den Namespace oder Typ in allen Quelldateien im aktuellen Projekt:

global using System.Text;

Sämtliche global using-Anweisungen müssen allen nicht globalen using-Anweisungen in der Quelldatei vorangestellt und dürfen nicht in einem namespace platziert werden. Andernfalls werden CS8915 bzw. CS8914 generiert.

Darüber hinaus kann eine static global using-Anweisung nicht auf einen dateilokalen Typ verweisen.

Aliasqualifizierer

Der Aliasqualifizierer (::) steht vor einem Namespacealias oder hinter dem global-Alias. Wenn Sie :: verwenden, wo eigentlich . verwendet werden sollte, um Elemente eines vollqualifizierten Namens zu trennen, gibt der Compiler einen der folgenden Fehler aus: CS0431, CS0432, CS0687, CS7000 oder CS8083.

Ersetzen Sie in allen Fällen :: durch das Trennzeichen ..

Wenn Sie außerdem einen Alias namens global definieren, gibt der Compiler CS0440 aus. Der global-Alias verweist immer auf den globalen Namespace. Sie können dafür keinen Alias deklarieren und sollten einen anderen Namen für Ihren Alias auswählen.

Konflikte bei Aliasnamen

Sie können mit einer using-Anweisung einen Alias für einen Namespace oder Typ deklarieren:

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

Sie sollten dem Alias einen eindeutigen Namen zuweisen – in den vorherigen Beispielen der Name links vom =-Zeichen. Die Verwendung eines Namens, der bereits einem Typ (z. B. Object) oder einem Namespace (System) zugeordnet ist, kann die Fehler CS0576 oder CS1537 verursachen.

Einschränkungen bei using-Aliasen

Vor C# 12 galten für die Programmiersprache bei using-Anweisungen, die einen Alias für eine Typdeklaration erstellen, die folgenden Einschränkungen:

  • Sie können keinen Alias mit einer using static-Anweisung erstellen:

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

Mit C# 12 wurden die folgenden Einschränkungen eingeführt:

  • Sie können die Modifizierer in, ref oder out in einem using-Alias nicht verwenden:

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • Eine „unsafe using“-Anweisung muss einen Alias oder static using angeben:

    // 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
    
  • Sie können keinen Alias für einen Nullable-Verweistyp erstellen:

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