Behandeln von Fehlern und Warnungen in Array- und Sammlungsdeklarationen und Initialisierungsausdrücken

In diesem Artikel werden die folgenden Compilerfehler behandelt:

  • CS0022: Falsche Indexanzahl in []. 'Zahl' wurde erwartet
  • CS0178: Ungültiger Rangbezeichner: ',' oder ']' erwartet
  • CS0248: Ein Array mit einer negativen Größe kann nicht erstellt werden.
  • CS0270: Die Arraygröße kann nicht in einer Variablendeklaration angegeben werden. (Versuchen Sie sie mit einem 'new'-Ausdruck zu initialisieren.)
  • CS0611: Arrayelemente können nicht vom folgenden Typ sein:
  • CS0623: Arrayinitialisierer können nur in einer Variablen oder einem Feldinitialisierer verwendet werden. Verwenden Sie stattdessen den Ausdruck „new“.
  • CS0650: Fehlerhafte Arraydeklaration: Beim Deklarieren eines verwalteten Arrays steht der Rangspezifizierer vor dem Variablenbezeichner. Zum Deklarieren eines Pufferfelds fester Größe verwenden Sie vor dem Feldtyp das Schlüsselwort „fixed“.
  • CS0719: Arrayelemente dürfen keinen statischen Typ aufweisen.
  • CS0747: Ungültige Deklaration des Initialisierermembers.
  • CS0820: Arrayinitialisierer kann keiner implizit typisierten lokalen Variablen zugewiesen werden.
  • CS0826: Es wurde kein optimaler Typ für das implizit typisierte Array gefunden.
  • CS0846: Ein geschachtelter Arrayinitialisierer wird erwartet.
  • CS1552: Der Arraytypspezifizierer [] muss vor dem Parameternamen stehen.
  • CS1586: Für die Arrayerstellung ist eine Arraygröße oder ein Arrayinitialisierer erforderlich.
  • CS1920: Der Elementinitialisierer darf nicht leer sein.
  • CS1921: Die beste Übereinstimmung für die überladene Methode hat eine falsche Signatur für das Initialisierungselement. Die initialisierbare „Add“-Methode muss eine zugängliche Instanzmethode sein.
  • CS1925: Ein Objekt vom Typ 'type' kann nicht mit einem Auflistungsinitialisierer initialisiert werden.
  • CS1954: Die beste Übereinstimmung für die überladene Methode für das Sammlungsinitialisierungselement kann nicht verwendet werden. „Add“-Methoden des Sammlungsinitialisierers dürfen über keine ref- oder out-Parameter verfügen.
  • CS9174: Der Typ kann nicht mit einem Sammlungsliteral initialisiert werden, da der Typ nicht konstruierbar ist.
  • CS9176: Es gibt keinen Zieltyp für das Sammlungsliteral.
  • CS9185: Der Generatortyp CollectionBuilderAttribute muss eine nicht generische Klasse oder Struktur sein.
  • CS9186: Der Name der CollectionBuilderAttribute-Methode ist ungültig.
  • CS9187: Es konnte keine barrierefreie Methode mit der erwarteten Signatur gefunden werden: eine statische Methode mit einem einzelnen Parameter vom Typ ReadOnlySpan<T>; und korrektem Rückgabetyp
  • CS9188: Typ verfügt über ein CollectionBuilderAttribute aber keinen Elementtyp.
  • CS9203: Ein Auflistungsausdruck dieses Typs kann in diesem Kontext nicht verwendet werden, da er außerhalb des aktuellen Bereichs verfügbar gemacht werden kann.
  • CS9210: Diese Version von System.Collections.Immutable.ImmutableArray<T> kann nicht mit Auflistungsausdrücken verwendet werden.

Darüber hinaus werden in diesem Artikel die folgenden Warnungen behandelt:

  • CS3007: Die überladene Methode 'method', die sich nur durch unbenannte Arraytypen unterscheidet, ist nicht CLS-kompatibel.
  • CS3016: Arrays als Attributargumente sind nicht CLS-kompatibel.
  • CS0251: Indizierung eines Arrays mit einem negativen Index (Arrayindizes starten immer mit Null).
  • CS9208: Sammlungsausdruck kann unerwartete Heapzuordnungen verursachen. Erwägen Sie, explizit ein Array zu erstellen und dann in den endgültigen Typ zu konvertieren, um die Zuordnung explizit zu machen.
  • CS9209: Der Sammlungsausdruck kann aufgrund der Verwendung von '..'-Spreads zu unerwarteten Heapzuweisungen führen. Erwägen Sie, explizit ein Array zu erstellen und dann in den endgültigen Typ zu konvertieren, um die Zuordnung explizit zu machen.

Weitere Informationen zu Arrays, Sammlungsinitialisierern und Sammlungsausdrücken finden Sie in den folgenden Artikeln:

Ungültiger Sammlungsinitialisierer

Die folgenden Fehler deuten darauf hin, dass der vom Compiler erzeugte Code für einen Sammlungsinitialisierer ungültig ist:

  • CS0747: Ungültige Deklaration des Initialisierermembers.
  • CS1920: Der Elementinitialisierer darf nicht leer sein.
  • CS1921: Die beste Übereinstimmung für die überladene Methode hat eine falsche Signatur für das Initialisierungselement. Die initialisierbare „Add“-Methode muss eine zugängliche Instanzmethode sein.
  • CS1954: Die beste Übereinstimmung für die überladene Methode für das Sammlungsinitialisierungselement kann nicht verwendet werden. „Add“-Methoden des Sammlungsinitialisierers dürfen über keine ref- oder out-Parameter verfügen.
  • CS9174: Der Typ kann nicht mit einem Sammlungsliteral initialisiert werden, da der Typ nicht konstruierbar ist.
  • CS9176: Es gibt keinen Zieltyp für das Sammlungsliteral.
  • CS9203: Ein Auflistungsausdruck dieses Typs kann in diesem Kontext nicht verwendet werden, da er außerhalb des aktuellen Bereichs verfügbar gemacht werden kann.
  • CS9210: Diese Version von System.Collections.Immutable.ImmutableArray<T> kann nicht mit Auflistungsausdrücken verwendet werden.

Der Compiler generiert möglicherweise auch die folgende Warnung:

  • CS9208: Sammlungsausdruck kann unerwartete Heapzuordnungen verursachen. Erwägen Sie, explizit ein Array zu erstellen und dann in den endgültigen Typ zu konvertieren, um die Zuordnung explizit zu machen.
  • CS9209: Der Sammlungsausdruck kann aufgrund der Verwendung von '..'-Spreads zu unerwarteten Heapzuweisungen führen. Erwägen Sie, explizit ein Array zu erstellen und dann in den endgültigen Typ zu konvertieren, um die Zuordnung explizit zu machen.

Die Fehler deuten darauf hin, dass der vom Compiler für einen Sammlungsinitialisierer generierte Code ungültig ist. Prüfen Sie Folgendes:

  • Ein Sammlungsinitialisierer enthält eine Abfolge von Elementen. Sie können die Einstellungseigenschaften für die Sammlungsinstanz nicht mit dem Hinzufügen von Elementen im selben Initialisierungsprogramm kombinieren.
  • Ein Sammlungsinitialisierer, der geschweifte Klammern ({ und }) enthält, darf nicht leer sein.
  • Auf eine konforme Add-Methode muss zugänglich sein und einen Parameter verwenden, der denselben Typ wie die Sammlungselemente aufweist. Der Parameter kann weder den ref-Modifizierer noch den out-Modifizierer enthalten.
  • Die Überladungsauflösung muss eine Add-Methode als bessere Übereinstimmung auswählen. Es können nicht mehrere übereinstimmende Methoden, die gleichermaßen gut sind, vorhanden sein.
  • Sammlungsausdrücke können explizit typisierte Variablen eines Sammlungstyps initialisieren. Wenn die Variable kein Sammlungs- oder Arraytyp ist oder implizit (mithilfe von var) eingegeben wird, kann kein Sammlungsinitialisierer verwendet werden.
  • Ein ref struct-Typ wie System.Span<T> kann nicht mit einem Sammlungsausdruck initialisiert werden, der gegen die Refsicherheit verstoßen kann.
  • Ein Sammlungsausdruck kann mit der aktuellen Version ein System.Collections.Immutable.ImmutableArray<T> nicht korrekt initialisieren. Verwenden Sie eine andere Version der Laufzeit, oder ändern Sie den Initialisierungsausdruck.

Die Warnungen weisen darauf hin, dass der Sammlungsausdruck, einschließlich aller Spread-Elemente, Speicher zuweisen könnte. Das Erstellen von unterschiedlichen Speicher- und Konvertierungsarten kann effizienter sein.

Ungültiger Arrayinitialisierer

  • CS0623: Arrayinitialisierer können nur in einer Variablen oder einem Feldinitialisierer verwendet werden. Verwenden Sie stattdessen den Ausdruck „new“.
  • CS0846: Ein geschachtelter Arrayinitialisierer wird erwartet.
  • CS1925: Ein Objekt vom Typ 'type' kann nicht mit einem Sammlungsinitialisierer initialisiert werden.

Diese Fehler deuten darauf hin, dass Sie einen ungültigen Initialisierer erstellt haben. Die Ursache sind wahrscheinlich unausgeglichene geschweifte Klammern ({ und }) um Elemente oder untergeordnete Arrays. Stellen Sie sicher, dass der Initialisierungsausdruck mit der Anzahl von Arrays in einer Jagged Array-Initialisierung übereinstimmt und dass die geschweiften Klammern ausgeglichen sind.

Ungültiger Zugriff auf Arrayelemente

  • CS0022: Falsche Indexanzahl in []. 'number' wurde erwartet
  • CS0251: Indizierung eines Arrays mit einem negativen Index (Arrayindizes starten immer mit Null).

Sie greifen auf ein Element eines Arrays zu, indem Sie den Index für jede Achse angeben, die im Array deklariert ist. Die Indizes liegen zwischen [ und ] nach dem Arraynamen. Es gibt zwei Regeln für die Arrayindizes:

  1. Sie müssen dieselbe Anzahl von Indizes angeben, die auch in der Arraydeklaration verwendet wird. Wenn das Array eine Dimension aufweist, müssen Sie einen Index angeben. Wenn das Array drei Dimensionen aufweist, müssen Sie drei Indizes angeben.
  2. Bei den Indizes muss es sich um nicht negative ganze Zahlen handeln.

Ungültiger Arrayrang

  • CS0178: Ungültiger Rangbezeichner: Erwartet wird ',' oder ']'
  • CS0650: Fehlerhafte Arraydeklaration: Beim Deklarieren eines verwalteten Arrays steht der Rangspezifizierer vor dem Variablenbezeichner. Zum Deklarieren eines Pufferfelds fester Größe verwenden Sie vor dem Feldtyp das Schlüsselwort „fixed“.
  • CS1552: Der Arraytypspezifizierer [] muss vor dem Parameternamen stehen.

Eine Arraydeklaration besteht aus den folgenden Token in der angegebenen Reihenfolge:

  1. Der Typ der Arrayelemente. Beispiel: int, string oder SomeClassType.
  2. Arrayklammern, optional einschließlich Kommas zur Darstellung von mehreren Dimensionen
  3. Der Variablenname.

Wenn eine Arrayinitialisierung die Arraydimensionen angibt, können Sie die folgenden Eigenschaften angeben:

  • Anzahl von Elementen in Klammern ({ und })
  • Leere Klammern
  • Mindestens ein in Klammern eingeschlossenes Komma

Alle folgenden Arraydeklarationen sind z. B. gültig:

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

Weitere Informationen finden Sie unter im Abschnitt „C#-Spezifikation“ (C#-Programmiersprachenspezifikation) unter „Arrayinitialisierer“.

Ungültige Arraylänge

  • CS0248: Ein Array mit einer negativen Größe kann nicht erstellt werden.
  • CS0270: Die Arraygröße kann in einer Variablendeklaration nicht angegeben werden. (Initialisieren Sie sie mit einem 'new'-Ausdruck.)
  • CS1586: Für die Arrayerstellung ist eine Arraygröße oder ein Arrayinitialisierer erforderlich.

Die Länge jeder Dimension eines Arrays muss als Teil der Arrayinitialisierung und nicht als Deklaration angegeben werden. Die Länge der einzelnen Dimensionen muss positiv sein. Sie können die Länge entweder mithilfe eines new-Ausdrucks angeben, um das Array zuzuweisen, oder mithilfe eines Arrayinitialisierers, um alle Elemente zuzuweisen. Das folgende Beispiel zeigt beide Mechanismen:

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Ungültiger Elementtyp

  • CS0611: Arrayelemente können nicht vom Typ 'type' sein.
  • CS0719: Arrayelemente dürfen keinen statischen Typ aufweisen.
  • CS0820: Arrayinitialisierer kann keiner implizit typisierten lokalen Variablen zugewiesen werden
  • CS0826: Es wurde kein optimaler Typ für das implizit typisierte Array gefunden.

Es gibt einige Typen, die nicht als Typ eines Arrays verwendet werden können. Diese Typen umfassen System.TypedReference und System.ArgIterator. Der Typ eines Arrays kann keine static-Klasse sein, da Instanzen einer static-Klasse nicht erstellt werden können.

Sie können Arrays als implizit typisierte lokale Variablen deklarieren. Das Array muss mithilfe eines new-Ausdrucks initialisiert werden. Darüber hinaus müssen alle Elemente in einem Arrayinitialisierer einen besten gemeinsamen Typ aufweisen. Die folgenden Beispiele zeigen, wie ein implizit typisiertes Array deklariert wird:

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

Sie können den besten gemeinsamen Typ mit einer der folgenden Techniken sicherstellen:

  • Weisen Sie dem Array einen expliziten Typ zu.
  • Weisen Sie allen Arrayelementen denselben Typ zu.
  • Stellen Sie explizite Umwandlungen für die Elemente bereit, die das Problem verursachen könnten.

Ungültiger Sammlungsgenerator

Die folgenden Fehler deuten auf Fehler im Typ des Sammlungsgenerators hin:

  • CS9185: Der Generatortyp CollectionBuilderAttribute muss eine nicht generische Klasse oder Struktur sein.
  • CS9186: Der Methodenname CollectionBuilderAttribute ist ungültig.
  • CS9187: Es konnte keine barrierefreie Methode mit der erwarteten Signatur gefunden werden: eine statische Methode mit einem einzelnen Parameter vom Typ ReadOnlySpan<T>; und korrektem Rückgabetyp
  • CS9188: Typ hat einen Elementtyp CollectionBuilderAttribute, aber keinen Elementtyp.

Diese Fehler deuten darauf hin, dass der Typ des Sammlungsgenerators geändert werden muss. Beachten Sie die folgenden Regeln:

  • Der Sammlungstyp muss über einen Iterationstyp verfügen. Mit anderen Worten: Sie können den Typ als Sammlung foreach.
  • Der Typ des Sammlungsgenerators kann kein generischer Typ sein.
  • Der im System.Runtime.CompilerServices.CollectionBuilderAttribute angegebene Methodenname muss ein gültiger Methodenname sein. Es kann z. B. kein Finalizer oder ein anderer Name sein, der ungültige Bezeichnerzeichen enthält.
  • Die Sammlungsgenerator-Methode muss eine barrierefreie statische Methode sein. Sie muss den Sammlungstyp zurückgeben, und einen Parameter ReadOnlySpan<T> annehmen, wenn T mit dem Elementtyp der Auflistung übereinstimmt.

CLS-Warnungen (Common Language Specification)

  • CS3007: Die überladene Methode 'method', die sich nur durch unbenannte Arraytypen unterscheidet, ist nicht CLS-kompatibel.
  • CS3016: Arrays als Attributargumente sind nicht CLS-kompatibel.

Fehler CS3007 tritt auf, wenn eine überladene Methode mit einem Jagged Array vorhanden ist und die Methodensignaturen sich lediglich durch den Elementtyp des Arrays unterscheiden. Um diesen Fehler zu vermeiden, sollten Sie ein rechteckiges Array anstelle eines Jagged Array verwenden oder das Attribut CLSCompliantAttribute entfernen, sofern keine CLS-Kompatibilität erforderlich ist. Weitere Informationen zu den CLS-Konformitätsregeln finden Sie unter Sprachunabhängigkeit und sprachunabhängige Komponenten.

Fehler CS3016 gibt an, dass es nicht mit der Common Language Specification (CLS) kompatibel ist, um ein Array an ein Attribut zu übergeben. Weitere Informationen zu den CLS-Konformitätsregeln finden Sie unter Sprachunabhängigkeit und sprachunabhängige Komponenten.