Auflösen von Warnungen im Zusammenhang mit Sprachfeatures und -versionen

In diesem Artikel werden die folgenden Compilerwarnungen behandelt:

  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: Funktion ist nicht verfügbar. Verwenden Sie eine neuere Sprachversion.
  • CS8058: Funktion ist experimentell.
  • CS8192: Die angegebene Sprachversion wird nicht unterstützt oder ist ungültig
  • CS8303: Die angegebene Sprachversion darf keine führenden Nullen enthalten
  • CS8304: Die Compilerversion ist kleiner als die Sprachversion
  • CS1738: Benannte Argumente müssen nach allen festen Argumenten angegeben werden.
  • CS8306: Der Name des Tupel-Elements wird abgeleitet.
  • CS8314: Ein Ausdruck vom Typ kann nicht von einem Muster vom Typ verarbeitet werden
  • CS8371: Feldbezogene Attribute für automatische Eigenschaften werden in der Sprachversion nicht unterstützt
  • CS8401: Um @$ anstelle von $@ für eine interpolierte wörtliche Zeichenfolge zu verwenden, verwenden Sie eine neuere Sprachversion.
  • CS8511: Ein Ausdruck vom Typ kann nicht von einem Muster vom Typ verarbeitet werden.
  • CS8627: Ein Nullable-Typparameter muss als Werttyp oder nicht Non-Nullable-Verweistyp bekannt sein
  • CS8630: Ungültige Nullwerte zulassende Optionen. Neuere Sprachversion verwenden
  • CS8652: Der Modifizierer ist für dieses Element nicht gültig.
  • CS8704: Der Typ implementiert den Schnittstellenmember nicht. Ein nicht öffentliches Mitglied kann nicht implizit implementiert werden.
  • CS8706: Der Typ kann keinen Schnittstellenmember implementieren, weil in dieser Version ein Feature nicht verfügbar ist.
  • CS8904: Ungültige Varianz: Der Typparameter muss gültig sein.
  • CS8912: Vererbung von einem Datensatz mit einem versiegelten „Object.ToString“ wird nicht unterstützt.
  • CS8919: Es kann kein angegebener Schnittstellenmember im Typ implementiert werden, da die Ziellaufzeit statische abstrakte Member in Schnittstellen nicht unterstützt.
  • CS8929: Die Methode kann keinen angegebenen Schnittstellenmember im Typ implementieren, da die Ziellaufzeit statische abstrakte Member in Schnittstellen nicht unterstützt.
  • CS8957: Bedingter Ausdruck ist in der Sprachversion ungültig, weil zwischen Typen kein gemeinsamer Typ gefunden wurde.
  • CS8967: Neue Zeilen in einer nicht wörtlichen interpolierten Zeichenfolge werden in C# nicht unterstützt
  • CS9014: Fehler: Verwendung möglicherweise nicht zugewiesener Eigenschaft. Aktualisieren Sie die Eigenschaft automatisch auf die Standardeinstellung.
  • CS9015: Fehler: Verwendung eines möglicherweise nicht zugewiesenen Felds. Führen Sie ein Upgrade auf das Feld automatisch aus.
  • CS9016: Warnung: Verwendung möglicherweise nicht zugewiesener Eigenschaft. Aktualisieren Sie die Eigenschaft automatisch auf die Standardeinstellung.
  • CS9017: Warnung: Verwendung möglicherweise nicht zugewiesener Felder. Führen Sie ein Upgrade auf das Feld automatisch aus.
  • CS9064: Ziellaufzeit unterstützt keine Referenzfelder.
  • CS9103: Definition in einem Modul mit einer nicht erkannten RefSafetyRulesAttribute-Version, die „11“ erwartet.
  • CS9171: Die Zielruntime unterstützt keine Inlinearraytypen.
  • CS9194: Das Argument kann nicht mit dem Schlüsselwort „ref“ übergeben werden. Um ref-Argumente an in-Parameter zu übergeben, müssen Sie auf die Sprachversion 12 oder höher aktualisieren.
  • CS9202: Die Funktion ist in C# 12.0. nicht verfügbar. Bitte verwenden Sie eine neuere Sprachversion
  • CS9211: Das DiagnosticId-Argument für das Attribut "Experimental" muss ein gültiger Bezeichner sein.

Darüber hinaus beziehen sich die folgenden Fehler und Warnungen auf Strukturinitialisierungsänderungen in aktuellen Versionen:

  • CS0171, CS8881: Das unterstützende Feld für die automatisch implementierte Eigenschaft „Name“ muss vollständig zugewiesen werden, bevor die Steuerung wieder an den Aufrufer übergeben wird.
  • CS0188, CS8885: Das Objekt „this“ kann nicht verwendet werden, bevor nicht alle seine Felder zugewiesen wurden
  • CS0843, CS8880: Das unterstützende Feld für die automatisch implementierte Eigenschaft „Name“ muss vollständig zugewiesen werden, bevor die Steuerung wieder an den Aufrufer übergeben wird
  • CS8305: Die Funktion dient nur zu Auswertungszwecken und kann in zukünftigen Aktualisierungen geändert oder entfernt werden.
  • CS9204: Der Typ dient nur zu Auswertungszwecken und kann in zukünftigen Aktualisierungen geändert oder entfernt werden. Unterdrücken Sie diese Diagnose, um fortzufahren.

Die Ursache für all diese Fehler und Warnungen liegt darin, dass der installierte Compiler eine neuere Version von C# unterstützt als die von Ihrem Projekt ausgewählte Version. Der C#-Compiler kann mit jeder früheren Version kompatibel sein. Sie können die Syntax anhand einer früheren Version von C# überprüfen oder weil Ihr Projekt ältere Bibliotheken oder Runtimes unterstützen muss.

Es gibt zwei mögliche Ursachen und drei Möglichkeiten, diese Fehler und Warnungen zu beheben.

Aktualisieren des Zielframeworks

Der Compiler bestimmt basierend auf den folgenden Regeln eine Standardversion:

Ziel Version C#-Sprachversionsstandard
.NET 8.x C# 12
.NET 7.x C# 11
.NET 6.x C# 10
.NET 5.x C# 9.0
.NET Core 3.x C# 8.0
.NET Core 2.x C# 7.3
.NET-Standard 2.1 C# 8.0
.NET-Standard 2.0 C# 7.3
.NET-Standard 1.x C# 7.3
.NET Framework alle C# 7.3

Wenn ihr ausgewähltes Framework nicht mit der erforderlichen Sprachversion übereinstimmt, können Sie das Zielframework aktualisieren.

Auswählen der entsprechenden Sprachversion

Möglicherweise haben Sie in Ihrer Projektdatei ein älteres Zielframework ausgewählt. Wenn Sie das LangVersion-Element aus Ihrer Projektdatei entfernen, verwendet der Compiler den Standardwert, der im vorherigen Abschnitt aufgeführt wurde. In der folgenden Tabelle sind alle aktuellen C#-Sprachversionen enthalten. Sie können auch eine bestimmte Sprachversion angeben, um neuere Features zu aktivieren.

Wert Bedeutung
preview Der Compiler akzeptiert jede gültige Sprachsyntax der letzten Vorschauversion.
latest Der Compiler akzeptiert die Syntax der neuesten veröffentlichte Version des Compilers (einschließlich Nebenversionen).
latestMajor
oder default
Der Compiler akzeptiert die Syntax der neuesten veröffentlichte Hauptversion des Compilers.
12.0 Der Compiler akzeptiert nur Syntax von C# 12 oder niedriger.
11.0 Der Compiler akzeptiert nur Syntax von C# 11 oder niedriger.
10.0 Der Compiler akzeptiert nur Syntax, die in C# 10 oder niedriger enthalten ist.
9.0 Der Compiler akzeptiert nur Syntax, die in C# 9 oder niedriger enthalten ist.
8.0 Der Compiler akzeptiert nur Syntax, die in C# 8.0 oder niedriger enthalten ist.
7.3 Der Compiler akzeptiert nur Syntax, die in C# 7.3 oder früher enthalten ist.
7.2 Der Compiler akzeptiert nur Syntax, die in C# 7.2 oder früher enthalten ist.
7.1 Der Compiler akzeptiert nur Syntax, die in C# 7.1 oder früher enthalten ist.
7 Der Compiler akzeptiert nur Syntax, die in C# 7.0 oder früher enthalten ist.
6 Der Compiler akzeptiert nur Syntax, die in C# 6.0 oder früher enthalten ist.
5 Der Compiler akzeptiert nur Syntax, die in C# 5.0 oder früher enthalten ist.
4 Der Compiler akzeptiert nur Syntax, die in C# 4.0 oder früher enthalten ist.
3 Der Compiler akzeptiert nur Syntax, die in C# 3.0 oder früher enthalten ist.
ISO-2
oder 2
Der Compiler akzeptiert nur Syntax, die in ISO/IEC 23270:2006 C# (2.0) enthalten ist.
ISO-1
oder 1
Der Compiler akzeptiert nur Syntax, die in ISO/IEC 23270:2003 C# (1.0/1.2) enthalten ist.

Weitere Informationen zu den für die einzelnen Frameworkversionen unterstützten Sprachversionen finden Sie im Artikel zum Konfigurieren der Sprachversion im entsprechenden Abschnitt der Sprachreferenz.

Vermeiden des aktualisierten Features

Wenn Sie ältere Bibliotheken oder Runtimes unterstützen müssen, müssen Sie möglicherweise die Verwendung neuerer Funktionen vermeiden.

Experimentelle Funktionen aktivieren

Die Diagnose für experimentelle Funktionen kann deaktiviert werden, um die experimentelle Funktion zu verwenden.

Warnung

Experimentelle Funktionen unterliegen Änderungen. Die APIs können sich ändern oder in zukünftigen Aktualisierungen entfernt werden. Das Einschließen experimenteller Funktionen ist eine Möglichkeit für Bibliotheksautoren, Feedback zu Ideen und Konzepten für die zukünftige Entwicklung zu erhalten. Seien Sie äußerst vorsichtig, wenn Sie eine als experimentell gekennzeichnete Funktion verwenden.

Sie können auch ihre eigenen experimentellen Features mithilfe der System.Diagnostics.CodeAnalysis.ExperimentalAttribute. Der Compiler gibt CS9211 aus, wenn der für die experimentelle Funktion verwendete Bezeichner kein gültiger Bezeichner ist.

Breaking Changes bei der Strukturinitialisierung

Alle diese Fehler und Warnungen tragen dazu bei, sicherzustellen, dass struct-Typen ordnungsgemäß initialisiert werden, bevor auf ihre Felder zugegriffen wird. In früheren Versionen von C# müssen Sie alle Felder in einer Struktur in einem beliebigen Konstruktor explizit zuweisen. Der parameterlose Konstruktor initialisiert alle Felder mit ihrem Standardwert. In späteren Versionen initialisieren alle Konstruktoren alle Felder. Entweder wird das Feld explizit festgelegt, in einem Feldinitialisierer festgelegt oder auf den Standardwert festgelegt.

  • CS0171, CS8881: Das unterstützende Feld für die automatisch implementierte Eigenschaft „Name“ muss vollständig zugewiesen werden, bevor die Steuerung wieder an den Aufrufer übergeben wird.
  • CS0188, CS8885: Das Objekt „this“ kann nicht verwendet werden, bevor nicht alle seine Felder zugewiesen wurden
  • CS0843, CS8880: Das unterstützende Feld für die automatisch implementierte Eigenschaft „Name“ muss vollständig zugewiesen werden, bevor die Steuerung wieder an den Aufrufer übergeben wird

Sie können diesen Fehler beheben, indem Sie Ihre Sprachversion auf C# 11 aktualisieren, jeder struct-Konstruktor initialisiert alle Felder. Wenn dies keine mögliche Option ist, müssen Sie den Standardkonstruktor explizit aufrufen, wie im folgenden Beispiel gezeigt:

struct S
{
    public int AIProp { get; set; }
    public S(int i){} //CS0843
    // Try the following lines instead.
    // public S(int i) : this()
    // {
    //     AIProp = i;
    // }
}

class Test
{
    static int Main()
    {
        return 1;
    }
}