Fouten en waarschuwingen met inlinematrixdeclaraties oplossen
In dit artikel worden de volgende compilerfouten en -waarschuwingen behandeld:
- CS9164: Kan expressie niet converteren naar
Span<T>
omdat het geen toewijsbare variabele is - CS9165: Kan expressie niet converteren naar
ReadOnlySpan<T>
omdat deze mogelijk niet wordt doorgegeven of geretourneerd door verwijzing - CS9166: Index valt buiten de grenzen van de inlinematrix
- CS9167: De lengte van de inlinematrix moet groter zijn dan 0.
- CS9168: Inline-matrixstruct mag geen expliciete indeling hebben.
- CS9169: Inline-matrixstruct moet één en slechts één exemplaarveld declareren dat geen ref-veld mag zijn.
- CS9172: Elementen van een inlinematrixtype kunnen alleen worden geopend met één argument impliciet converteerbaar naar
int
,System.Index
ofSystem.Range
. - CS9173: Een inlinematrixtoegang heeft mogelijk geen benoemd argumentaanduiding
- CS9180: Inline-matrixelementveld kan niet worden gedeclareerd als vereist, alleen-lezen, vluchtig of als buffer met een vaste grootte.
- CS9181: De indexeerfunctie voor inlinematrix wordt niet gebruikt voor elementtoegangsexpressie.
- CS9182: Inlinematrix Slice wordt niet gebruikt voor elementtoegangsexpressie.
- CS9183: De operator voor inlinematrixconversie wordt niet gebruikt voor conversie van expressies van het declaratietype.
- CS9184: De taalfunctie 'Inlinematrices' wordt niet ondersteund voor inlinematrixtypen met een elementveld dat een veld
ref
'' is of een type heeft dat niet geldig is als een typeargument. - CS9189:
foreach
instructie voor een inlinematrix van het type wordt niet ondersteund - CS9259: Kenmerk System.Runtime.CompilerServices.InlineArrayAttribute kan niet worden toegepast op een recordstruct.
Inlinematrixdeclaratie
U declareert inlinematrices als een struct
type met één veld en een kenmerk dat de lengte van de matrix aangeeft. De compiler genereert de volgende fouten voor ongeldige inlinematrixdeclaraties:
- CS9167: De lengte van de inlinematrix moet groter zijn dan 0.
- CS9168: Inline-matrixstruct mag geen expliciete indeling hebben.
- CS9169: Inline-matrixstruct moet één en slechts één exemplaarveld declareren dat geen ref-veld mag zijn.
- CS9180: Inline-matrixelementveld kan niet worden gedeclareerd als vereist, alleen-lezen, vluchtig of als buffer met een vaste grootte.
- CS9184: De taalfunctie 'Inlinematrices' wordt niet ondersteund voor inlinematrixtypen met een elementveld dat een veld
ref
'' is of een type heeft dat niet geldig is als een typeargument. - CS9259: Kenmerk System.Runtime.CompilerServices.InlineArrayAttribute kan niet worden toegepast op een recordstruct.
Als u deze matrices wilt herstellen, moet u ervoor zorgen dat het volgende waar is:
- Het argument voor het System.Runtime.CompilerServices.InlineArrayAttribute is een positief geheel getal.
- Bij het insluiten
struct
wordt geen expliciete indeling opgegeven. - Het insluiten
struct
heeft één exemplaarveld en dat exemplaarveld is geenref
veld. - Het veld met één exemplaar is geen buffer met een vaste grootte.
- Het veld met één exemplaar bevat niet de
required
,volatile
ofreadonly
modifiers. - Verwijder de wijzigingsfunctie uit de
record
inlinematrixdeclaratie.
Toegang tot elementen
U opent elementen van een inlinematrix op dezelfde manier als elke matrix. De compiler verzendt de volgende fouten van onjuiste elementtoegang:
- CS9166: Index valt buiten de grenzen van de inlinematrix
- CS9172: Elementen van een inlinematrixtype kunnen alleen worden geopend met één argument impliciet converteerbaar naar
int
,System.Index
ofSystem.Range
. - CS9173: Een inlinematrixtoegang heeft mogelijk geen benoemd argumentaanduiding
- CS9189:
foreach
instructie voor een inlinematrix van het type wordt niet ondersteund
Bovendien geeft de compiler de volgende waarschuwing uit wanneer u een indexeerfunctie declareert:
- CS9181: De indexeerfunctie voor inlinematrix wordt niet gebruikt voor elementtoegangsexpressie.
De gegenereerde code voor een inlinebuffer heeft rechtstreeks toegang tot het buffergeheugen, waardoor eventuele gedeclareerde indexeerfuncties worden overgeslagen. Inlinematrices kunnen niet worden gebruikt met de foreach
instructie.
Het argument voor de indexeerfunctie moet zijn:
- Een van deze drie typen:
int
, eenSystem.Index
of eenSystem.Range
. - Kan geen benoemd argument zijn. De compiler genereert de elementtoegangsor. De parameter heeft geen naam, dus u kunt geen benoemde argumenten gebruiken.
- Is opgenomen in de grenzen van de matrix. Net als alle .NET-matrices wordt de toegang tot inlinematrixelementen gecontroleerd. De index moet binnen de grenzen van de inlinematrix vallen.
Conversies naar span
U gebruikt System.Span<T> of System.ReadOnlySpan<T> werkt vaak met inlinematrices. De compiler genereert de volgende fouten voor ongeldige conversies:
- CS9164: Kan expressie niet converteren naar
Span<T>
omdat het geen toewijsbare variabele is - CS9165: Kan expressie niet converteren naar
ReadOnlySpan<T>
omdat deze mogelijk niet wordt doorgegeven of geretourneerd door verwijzing
De compiler genereert code die rechtstreeks toegang heeft tot het geheugen voor een inlinebuffer. Daarom worden sommige leden nooit gebeld. De compiler genereert de volgende waarschuwingen als u een van de leden schrijft die nooit worden aangeroepen:
- CS9182: Inlinematrix Slice wordt niet gebruikt voor elementtoegangsexpressie.
- CS9183: De operator voor inlinematrixconversie wordt niet gebruikt voor conversie van expressies van het declaratietype.
Een inlinematrix kan impliciet worden geconverteerd naar een Span<T>
of ReadOnlySpan<T>
om een inlinematrix door te geven aan methoden. De compiler dwingt beperkingen af voor deze conversies:
- De inlinematrix moet beschrijfbaar zijn om een inlinematrix te converteren naar een
Span<T>
. Als de matrix alleen-lezen is, kunt u deze niet converteren naar een beschrijfbaarSpan<T>
bestand. U kunt in plaats daarvan gebruikenReadOnlySpan<T>
. - De veilige context van de inlinematrix moet minstens zo breed zijn als de veilige context van de
Span<T>
ofReadOnlySpan<T>
om de conversie te voltooien. U moet de context van het bereik beperken of het bereik van de inlinematrix uitbreiden.
Bovendien genereert de compiler nooit aanroepen naar een Slice
methode in een inlinebuffer. Conversieoperators voor het converteren van een inlinebuffer naar een Span
of ReadOnlySpan
worden niet aangeroepen. De compiler genereert code om een System.Span<T> of System.ReadOnlySpan<T> rechtstreeks vanuit de geheugenbuffer te maken.