Dela via


Lösa fel och varningar med infogade matrisdeklarationer

Den här artikeln beskriver följande kompilatorfel och varningar:

  • CS9164: Det går inte att konvertera uttrycket till Span<T> eftersom det inte är en tilldelningsbar variabel
  • CS9165: Det går inte att konvertera uttryck till ReadOnlySpan<T> eftersom det kanske inte skickas eller returneras av referens
  • CS9166: Index ligger utanför gränserna för den infogade matrisen
  • CS9167: Den infogade matrisens längd måste vara större än 0.
  • CS9168: Infogad matris struct får inte ha explicit layout.
  • CS9169: Inline array struct måste deklarera ett och endast ett instansfält som inte får vara ett referensfält.
  • CS9172: Element av en infogad matristyp kan endast nås med ett enda argument implicit konvertibelt till int, System.Indexeller System.Range.
  • CS9173: En infogad matrisåtkomst kanske inte har någon namngiven argumentspecificerare
  • CS9180: Infogat matriselementfält kan inte deklareras som obligatoriskt, skrivskyddat, flyktigt eller som en buffert med fast storlek.
  • CS9181: Inline array indexer används inte för elementåtkomstuttryck.
  • CS9182: Den infogade matrisen "Slice"-metoden används inte för elementåtkomstuttryck.
  • CS9183: Operatorn för infogad matriskonvertering används inte för konvertering från uttryck av deklareringstypen.
  • CS9184: Språkfunktionen Infogade matriser stöds inte för infogade matristyper med elementfält som antingen är ett fältref eller har en typ som inte är giltig som ett typargument.
  • CS9189: foreach -instruktion på en infogad matris av typen stöds inte
  • CS9259: Attributet System.Runtime.CompilerServices.InlineArrayAttribute kan inte tillämpas på en post struct.

Deklaration av infogad matris

Du deklarerar infogade matriser som en struct typ med ett enda fält och ett attribut som anger matrisens längd. Kompilatorn genererar följande fel för ogiltiga inline-matrisdeklarationer:

  • CS9167: Den infogade matrisens längd måste vara större än 0.
  • CS9168: Infogad matris struct får inte ha explicit layout.
  • CS9169: Inline array struct måste deklarera ett och endast ett instansfält som inte får vara ett referensfält.
  • CS9180: Infogat matriselementfält kan inte deklareras som obligatoriskt, skrivskyddat, flyktigt eller som en buffert med fast storlek.
  • CS9184: Språkfunktionen Infogade matriser stöds inte för infogade matristyper med elementfält som antingen är ett fältref eller har en typ som inte är giltig som ett typargument.
  • CS9259: Attributet System.Runtime.CompilerServices.InlineArrayAttribute kan inte tillämpas på en post struct.

Om du vill åtgärda dessa matriser kontrollerar du att följande är sant:

  • Argumentet till System.Runtime.CompilerServices.InlineArrayAttribute är ett positivt heltal.
  • Omslutningen struct anger ingen explicit layout.
  • Omslutningen struct har ett enda instansfält och det instansfältet är inte ett ref fält.
  • Det enda instansfältet är inte en buffert med fast storlek.
  • Det enda instansfältet innehåller requiredinte modifierarna , volatileeller readonly .
  • Ta bort modifieraren från deklarationen record för den infogade matrisen.

Elementåtkomst

Du kommer åt element i en infogad matris på samma sätt som alla matriser. Kompilatorn genererar följande fel från felaktig elementåtkomst:

  • CS9166: Index ligger utanför gränserna för den infogade matrisen
  • CS9172: Element av en infogad matristyp kan endast nås med ett enda argument implicit konvertibelt till int, System.Indexeller System.Range.
  • CS9173: En infogad matrisåtkomst kanske inte har någon namngiven argumentspecificerare
  • CS9189: foreach -instruktion på en infogad matris av typen stöds inte

Dessutom utfärdar kompilatorn följande varning när du deklarerar en indexerare:

  • CS9181: Inline array indexer används inte för elementåtkomstuttryck.

Den genererade koden för en infogad buffert kommer åt buffertminnet direkt och kringgår alla deklarerade indexerare. Infogade matriser kan inte användas med -instruktionen foreach .

Argumentet till indexeraren måste vara:

  • En av dessa tre typer: int, en System.Index eller en System.Range.
  • Det kan inte vara ett namngivet argument. Kompilatorn genererar elementåtkomstorn. Parametern har inget namn, så du kan inte använda namngivna argument.
  • Ingår i matrisens gränser. Precis som alla .NET-matriser kontrolleras åtkomsten till infogade matriselement. Indexet måste ligga inom gränserna för den infogade matrisen.

Konverteringar till span

Du använder System.Span<T> ofta eller System.ReadOnlySpan<T> för att arbeta med infogade matriser. Kompilatorn genererar följande fel för ogiltiga konverteringar:

  • CS9164: Det går inte att konvertera uttrycket till Span<T> eftersom det inte är en tilldelningsbar variabel
  • CS9165: Det går inte att konvertera uttryck till ReadOnlySpan<T> eftersom det kanske inte skickas eller returneras av referens

Kompilatorn genererar kod som direkt kommer åt minnet för en infogad buffert. Därför anropas inte vissa medlemmar. Kompilatorn genererar följande varningar om du skriver en av de medlemmar som aldrig anropas:

  • CS9182: Den infogade matrisen "Slice"-metoden används inte för elementåtkomstuttryck.
  • CS9183: Operatorn för infogad matriskonvertering används inte för konvertering från uttryck av deklareringstypen.

En infogad matris kan implicit konverteras till en Span<T> eller ReadOnlySpan<T> för att skicka en infogad matris till metoder. Kompilatorn tillämpar begränsningar för dessa konverteringar:

  • Den infogade matrisen måste vara skrivbar för att konvertera en infogad matris till en Span<T>. Om matrisen är skrivskyddad kan du inte konvertera den till en skrivbar Span<T>. Du kan använda ReadOnlySpan<T> i stället.
  • Den säkra kontexten för den infogade matrisen måste vara minst lika bred som den säkra kontexten Span<T> för eller ReadOnlySpan<T> för att konverteringen ska lyckas. Du måste antingen begränsa intervallets kontext eller utöka omfånget för den infogade matrisen.

Kompilatorn genererar dessutom aldrig anrop till en Slice metod i en infogad buffert. Konverteringsoperatorer för att konvertera en infogad buffert till en Span eller ReadOnlySpan anropas inte. Kompilatorn genererar kod för att skapa en System.Span<T> eller System.ReadOnlySpan<T> direkt från minnesbufferten.