Beheben von Fehlern und Warnungen mit Inlinearraydeklarationen
Dieser Artikel behandelt die folgenden Compiler-Fehler und -Warnungen:
- CS9164: Der Ausdruck kann nicht in
Span<T>
konvertiert werden, da es sich nicht um eine zuweisbare Variable handelt. - CS9165: Der Ausdruck kann nicht in
ReadOnlySpan<T>
konvertiert werden, da er nicht als Referenz übergeben oder zurückgegeben werden darf. - CS9166: Der Index liegt außerhalb der Grenzen des Inlinearrays
- CS9167: Die Länge des Inlinearrays muss größer als 0 sein.
- CS9168: Die Struktur des Inlinearrays darf kein explizites Layout aufweisen.
- CS9169: Die Struktur des Inlinearrays muss genau ein Instanzfeld deklarieren, das kein Referenzfeld sein darf.
- CS9172: Auf Elemente eines Inlinearraytyps kann nur mit einem einzelnen Argument zugegriffen werden, das implizit in
int
,System.Index
, oderSystem.Range
, konvertiert werden kann. - CS9173: Der Zugriff auf ein Inlinearray verfügt möglicherweise nicht über einen benannten Argumentspezifizierer
- CS9180: Inlinearray-Elementfeld kann nicht als erforderlich, schreibgeschützt, veränderlich oder als Puffer mit fester Größe deklariert werden.
- CS9181: Inlinearrayindexer wird nicht für den Elementzugriffsausdruck verwendet.
- CS9182: Die Inlinearray-Methode „Slice“ wird nicht für den Elementzugriffsausdruck verwendet.
- CS9183: Der Konvertierungsoperator des Inlinearrays wird nicht für die Konvertierung aus dem Ausdruck des deklarierenden Typs verwendet.
- CS9184: Die Sprachfunktion „Inlinearrays“ wird für Inlinearraytypen mit Elementfeld nicht unterstützt, bei dem es sich entweder um ein '
ref
' Feld handelt oder einen Typ aufweist, der nicht als Typargument gültig ist. - CS9189:
foreach
-Anweisung für ein Inlinearray vom Typ wird nicht unterstützt. - CS9259: Attribut System.Runtime.CompilerServices.InlineArrayAttribute kann nicht auf eine Datensatzstruktur angewendet werden.
Inlinearraydeklaration
Sie deklarieren Inlinearrays als struct
-Typ mit einem einzelnen Feld und einem Attribut, das die Länge des Arrays angibt. Der Compiler generiert die folgenden Fehler für ungültige Inlinearraydeklarationen:
- CS9167: Die Länge des Inlinearrays muss größer als 0 sein.
- CS9168: Die Struktur des Inlinearrays darf kein explizites Layout aufweisen.
- CS9169: Die Struktur des Inlinearrays muss genau ein Instanzfeld deklarieren, das kein Referenzfeld sein darf.
- CS9180: Inlinearray-Elementfeld kann nicht als erforderlich, schreibgeschützt, veränderlich oder als Puffer mit fester Größe deklariert werden.
- CS9184: Die Sprachfunktion „Inlinearrays“ wird für Inlinearraytypen mit Elementfeld nicht unterstützt, bei dem es sich entweder um ein '
ref
' Feld handelt oder einen Typ aufweist, der nicht als Typargument gültig ist. - CS9259: Attribut System.Runtime.CompilerServices.InlineArrayAttribute kann nicht auf eine Datensatzstruktur angewendet werden.
Um diese Arrays zu beheben, stellen Sie sicher, dass Folgendes zutrifft:
- Das Argument für System.Runtime.CompilerServices.InlineArrayAttribute ist eine positive ganze Zahl.
- Das umschließende
struct
gibt kein explizites Layout an. - Das einschließende
struct
verfügt über ein einzelnes Instanzfeld und dieses Instanzfeld ist keinref
-Feld. - Das Einzelne Instanzfeld ist kein Puffer mit fester Größe.
- Das einzelne Instanzfeld enthält keinen der Modifizierer
required
,volatile
oderreadonly
. - Entfernen Sie den
record
Modifizierer aus der Inlinearraydeklaration.
Elementzugriff
Sie greifen auf Elemente eines Inlinearrays auf die gleiche Weise wie jedes Array zu. Der Compiler gibt aufgrund eines falschen Elementzugriffs die folgenden Fehler aus:
- CS9166: Der Index liegt außerhalb der Grenzen des Inlinearrays
- CS9172: Auf Elemente eines Inlinearraytyps kann nur mit einem einzelnen Argument zugegriffen werden, das implizit in
int
,System.Index
oderSystem.Range
konvertiert wird. - CS9173: Ein Inlinearrayzugriff verfügt möglicherweise nicht über einen benannten Argumentspezifizierer
- CS9189:
foreach
Anweisung für ein Inlinearray vom Typ wird nicht unterstützt.
Darüber hinaus gibt der Compiler beim Deklarieren eines Indexers die folgende Warnung aus:
- CS9181: Inlinearrayindexer wird nicht für den Elementzugriffsausdruck verwendet.
Der generierte Code für einen Inline-Puffer greift direkt auf den Pufferspeicher zu und umgeht dabei alle deklarierten Indexer. Inlinearrays können nicht mit der foreach
-Anweisung verwendet werden.
Das Argument für den Indexer muss wie folgt lauten:
- Einer der drei Typen:
int
, einSystem.Index
oder einSystem.Range
. - Kann kein benanntes Argument sein. Der Compiler generiert die Zugriffsmethode für das Element. Der Parameter hat keinen Namen, sodass Sie keine benannten Argumente verwenden können.
- Ist in den Grenzen des Arrays enthalten. Wie bei allen .NET-Arrays wird der Zugriff auf Inlinearrayelemente auf seine Grenzen hin überprüft. Der Index muss sich innerhalb der Grenzen des Inlinearrays befinden.
Konvertierungen in Span
Sie verwenden System.Span<T> oder System.ReadOnlySpan<T> häufig, um mit Inlinearrays zu arbeiten. Der Compiler generiert die folgenden Fehler für ungültige Konvertierungen:
- CS9164: Der Ausdruck kann nicht in
Span<T>
konvertiert werden, da es sich nicht um eine zuweisbare Variable handelt - CS9165: Der Ausdruck kann nicht in
ReadOnlySpan<T>
konvertiert werden, da er nicht als Referenz übergeben oder zurückgegeben werden darf
Der Compiler erzeugt Code, der direkt auf den Speicher für einen Inline-Puffer zugreift. Daher werden einige Member nie aufgerufen. Der Compiler erzeugt die folgenden Warnungen, wenn Sie eines der Member schreiben, die nie aufgerufen werden:
- CS9182: Die Inlinearray -Methode „Slice“ wird nicht für den Elementzugriffsausdruck verwendet.
- CS9183: Der Konvertierungsoperator des Inlinearrays wird nicht für die Konvertierung aus dem Ausdruck des deklarierenden Typs verwendet.
Ein Inlinearray kann implizit in ein Span<T>
oder ein ReadOnlySpan<T>
konvertiert werden, um ein Inlinearray an Methoden zu übergeben. Der Compiler erzwingt Einschränkungen für diese Konvertierungen:
- Das Inlinearray muss beschreibbar sein, um ein Inlinearray in ein
Span<T>
konvertieren zu können. Wenn das Array readonly, können Sie es nicht in ein schreibbaresSpan<T>
konvertieren. Sie können stattdessenReadOnlySpan<T>
verwenden. - Der sichere Kontext des Inlinearrays muss mindestens so breit wie der sichere Kontext von
Span<T>
oderReadOnlySpan<T>
sein, damit die Konvertierung erfolgreich ist. Sie müssen entweder den Kontext der Spanne einschränken oder den Bereich des Inlinearrays erweitern.
Darüber hinaus generiert der Compiler nie Aufrufe an eine Slice
-Methode in einem Inlinepuffer. Konvertierungsoperatoren zum Konvertieren eines Inlinepuffers in einen Span
oder ReadOnlySpan
werden nicht aufgerufen. Der Compiler generiert Code, um System.Span<T> oder System.ReadOnlySpan<T> direkt aus dem Speicherpuffer zu erstellen.