Dela via


Lösa fel och varningar i matris- och samlingsdeklarationer och initieringsuttryck

Den här artikeln beskriver följande kompilatorfel:

  • CS0022: Fel antal index i [], förväntat "tal"
  • CS0178: Ogiltig rangspecificerare: förväntad "," eller "]"
  • CS0248: Det går inte att skapa en matris med en negativ storlek
  • CS0270: Matrisstorleken kan inte anges i en variabeldeklaration (försök initiera med ett uttrycknew)
  • CS0611: Matriselement kan inte vara av typen
  • CS0623: Matrisinitierare kan endast användas i en variabel eller fältinitierare. Prova att använda ett nytt uttryck i stället.
  • CS0650: Felaktig matrisdeklarator: Om du vill deklarera en hanterad matris föregår rankningsspecificeraren variabelns identifierare. Om du vill deklarera ett buffertfält med fast storlek använder du det fasta nyckelordet före fälttypen.
  • CS0719: Matriselement kan inte vara av statisk typ
  • CS0747: Ogiltig initieringsmedlemsdeklarator.
  • CS0820: Det går inte att tilldela matrisinitierare till en implicit skriven lokal
  • CS0826: Ingen bästa typ hittades för implicit typ av matris.
  • CS0846: En kapslad matrisinitierare förväntas
  • CS1063: Den bästa överlagrade Metoden Lägg till för insamlingsinitieraren är föråldrad.
  • CS1552: Matristypsspecificerare, [], måste visas före parameternamnet
  • CS1586: Matrisskapandet måste ha matrisstorlek eller matrisinitierare
  • CS1920: Elementinitieraren får inte vara tom.
  • CS1921: Den bästa överlagrade metodmatchningen har fel signatur för initieringselementet. Initializable Add måste vara en tillgänglig instansmetod.
  • CS1925: Det går inte att initiera objekt av typen "typ" med en samlingsinitierare.
  • CS1950: Den bästa överlagrade metoden Lägg till för insamlingsinitieraren har några ogiltiga argument.
  • CS1954: Den bästa överlagrade metodmatchningen för initieringselementet för samlingen kan inte användas. InsamlingsinitierarensAdd metoder kan inte ha ref eller out parametrar.
  • CS9174: Det går inte att initiera typen med en samlingsliteral eftersom typen inte är konstruktionsbar.
  • CS9176: Det finns ingen måltyp för samlingens literal.
  • CS9185: Builder-typen CollectionBuilderAttribute måste vara en icke-generisk klass eller struct.
  • CS9186: Metoden CollectionBuilderAttribute är ogiltig.
  • CS9187: Det gick inte att hitta en tillgänglig metod med den förväntade signaturen: en statisk metod med en enda parameter av typen ReadOnlySpan<T>och rätt returtyp
  • CS9188: Typen har en CollectionBuilderAttribute men ingen elementtyp.
  • CS9203: Ett samlingsuttryck av den här typen kan inte användas i den här kontexten eftersom det kan exponeras utanför det aktuella omfånget.
  • CS9210: Den här versionen av System.Collections.Immutable.ImmutableArray<T>kan inte användas med samlingsuttryck.
  • CS9212: Spridningsoperatorn ".." kan inte användas på variabler av typen "typ" eftersom "typ" inte innehåller någon offentlig instans eller tilläggsdefinition för "medlem".
  • CS9213: Samlingsuttryckets måltyp har ingen elementtyp.
  • CS9214: Samlingsuttryckstypen måste ha en tillämplig konstruktor som kan anropas utan argument.
  • CS9215: Samlingsuttryckstypen "type" måste ha en instans eller tilläggsmetod "Lägg till" som kan anropas med ett enda argument.
  • CS9222: Insamlingsinitieraren resulterar i en oändlig kedja av instansiering av samlingens typ.
  • CS9332: Det går inte att använda spridningsoperatorn .. i filteruttrycket för en catch-sats.
  • CS9354: "with(...)"-elementet måste vara det första elementet
  • CS9355: "with(...)"-element stöds inte för typen "type"
  • CS9356: Elementargumenten "with(...)" kan inte vara dynamiska
  • CS9357: "with(...)"-elementet för ett skrivskyddat gränssnitt måste vara tomt om det är närvarande
  • CS9358: Elementtypen för den här samlingen får inte vara en ref struct eller en typparameter som tillåter ref structs
  • CS9359: Ingen överlagring för metoden "method" tar elementargumenten "number" "with(...)"

Dessutom beskrivs följande varningar i den här artikeln:

  • CS1062: Den bästa överlagrade Metoden Lägg till för insamlingsinitieraren är föråldrad.
  • CS1064: Den bästa överlagrade Metoden Lägg till för insamlingsinitieraren är föråldrad.
  • CS3007: Överlagrad metod som endast skiljer sig från icke namngivna matristyper är inte CLS-kompatibel
  • CS3016: Matriser som attributargument är inte CLS-kompatibla
  • CS0251: Indexera en matris med ett negativt index (matrisindex börjar alltid på noll)
  • CS9208: Samlingsuttrycket kan medföra oväntade heapallokeringar. Överväg att explicit skapa en matris och sedan konvertera till den slutliga typen för att göra allokeringen explicit.
  • CS9209: Samlingsuttrycket kan medföra oväntade heapallokeringar på grund av användning av ".." spridningar. Överväg att explicit skapa en matris och sedan konvertera till den slutliga typen för att göra allokeringen explicit.
  • CS9332: Det går inte att använda spridningsoperatorn .. i filteruttrycket för en catch-sats.

Ogiltig åtkomst till matriselement

  • CS0022: Fel antal index i [], förväntat "tal"
  • CS0251: Indexera en matris med ett negativt index (matrisindex börjar alltid på noll)

Följ dessa indexeringsregler om du vill komma åt matriselement korrekt. Mer information finns i Matriser.

  • Ange samma antal index som deklarerade dimensioner (CS0022). En endimensionell matris behöver ett index. en tredimensionell matris behöver tre index.
  • Använd endast icke-negativa heltal för matrisindex (CS0251). Matrisindex börjar alltid på noll.

Ogiltig insamlingsinitierare

  • CS0747: Ogiltig initieringsmedlemsdeklarator.
  • CS1920: Elementinitieraren får inte vara tom.
  • CS1921: Den bästa överlagrade metodmatchningen har fel signatur för initieringselementet. Initializable Add måste vara en tillgänglig instansmetod.
  • CS1922: Det går inte att initiera typen "typ" med en insamlingsinitierare eftersom "typ" inte implementerar "System.Collections.IEnumerable".
  • CS1925: Det går inte att initiera objekt av typen "typ" med en samlingsinitierare.
  • CS1927: Varning: Ignorera /win32manifest för modulen eftersom den endast gäller för sammansättningar
  • CS1950: Den bästa överlagrade metoden Lägg till för insamlingsinitieraren har några ogiltiga argument.
  • CS1954: Den bästa överlagrade metodmatchningen för initieringselementet för samlingen kan inte användas. InsamlingsinitierarensAdd metoder kan inte ha ref eller out parametrar.
  • CS9174: Det går inte att initiera typen med en samlingsliteral eftersom typen inte är konstruktionsbar.
  • CS9176: Det finns ingen måltyp för samlingens literal.
  • CS9203: Ett samlingsuttryck av den här typen kan inte användas i den här kontexten eftersom det kan exponeras utanför det aktuella omfånget.
  • CS9210: Den här versionen av System.Collections.Immutable.ImmutableArray<T> kan inte användas med samlingsuttryck.
  • CS9212: Spridningsoperatorn ".." kan inte användas på variabler av typen "typ" eftersom "typ" inte innehåller någon offentlig instans eller tilläggsdefinition för "medlem".
  • CS9213: Samlingsuttryckets måltyp har ingen elementtyp.
  • CS9214: Samlingsuttryckstypen måste ha en tillämplig konstruktor som kan anropas utan argument.
  • CS9215: Samlingsuttryckstypen "type" måste ha en instans eller tilläggsmetod "Lägg till" som kan anropas med ett enda argument.
  • CS9222: Insamlingsinitieraren resulterar i en oändlig kedja av instansiering av samlingens typ.
  • CS9332: Det går inte att använda spridningsoperatorn .. i filteruttrycket för en catch-sats.
  • CS9354: "with(...)"-elementet måste vara det första elementet
  • CS9355: "with(...)"-element stöds inte för typen "type"
  • CS9356: Elementargumenten "with(...)" kan inte vara dynamiska
  • CS9357: 'with(...)'-element för ett icke-skrivbart gränssnitt måste vara tomt om det används
  • CS9358: Elementtypen för den här samlingen får inte vara en ref struct eller en typparameter som tillåter ref structs
  • CS9359: Ingen överlagring för metoden "method" tar elementargumenten "number" "with(...)"

Kompilatorn kan också generera följande varningar:

  • CS1062: Den bästa överlagrade Metoden Lägg till för insamlingsinitieraren är föråldrad.
  • CS1063: Den bästa överlagrade Metoden Lägg till för insamlingsinitieraren är föråldrad.
  • CS1064: Den bästa överlagrade Metoden Lägg till för insamlingsinitieraren är föråldrad.
  • CS9208: Samlingsuttrycket kan medföra oväntade heapallokeringar. Överväg att explicit skapa en matris och sedan konvertera till den slutliga typen för att göra allokeringen explicit.
  • CS9209: Samlingsuttrycket kan medföra oväntade heapallokeringar på grund av användning av ".." spridningar. Överväg att explicit skapa en matris och sedan konvertera till den slutliga typen för att göra allokeringen explicit.

Följ dessa regler om du vill skapa giltiga insamlingsinitierare. Mer information finns i Samlingsuttryck.

  • Blanda inte egenskapsinitiering med elementtillägg i samma initierare (CS0747).
  • Inkludera minst ett element i samlinginitierare med klammerparenteser (CS1920).
  • Se till att samlingstypen implementerar IEnumerable (CS1922).
  • Använd endast insamlingsinitierare med samlingstyper (CS1925).
  • Kontrollera att Add metoden är tillgänglig, tar en parameter som matchar elementtypen och inte använder ref eller out modifierar (CS1921, CS1954).
  • Lös tvetydiga Add metodöverlagringar (CS1950).
  • Ange en explicit måltyp för samlingsuttryck när kompilatorn inte kan härleda den (CS9176, CS9213).
  • Kontrollera att samlingstypen är konstruerad med en parameterlös konstruktor (CS9174, CS9214).
  • Använd ref struct inte typer i samlingsuttryck som kan strida mot referenssäkerheten (CS9203).
  • Uppdatera till en motsvarande körtidsversion för ImmutableArray samlingsuttryck (CS9210).
  • Implementera uppräkningsmönster (till exempel GetEnumerator) för stöd för spridningsoperatorer (CS9212).
  • Undvik cirkulära beroenden i insamlingsinitiering (CS9222).
  • Använd inte spridningsoperatorn i catch-satsfilteruttryck (CS9332).
  • Placera elementet with(...) först i samlingsuttryck (CS9354).
  • Använd with(...) endast element med typer som stöder argument för samlingsuttryck (CS9355).
  • Använd inte dynamiska argument i with(...) element (CS9356).
  • Använd tom with() för skrivskyddade gränssnittstyper (CS9357).
  • Använd inte referensstruktureringstyper som elementtyper i samlingar som inte stöder dem (CS9358).
  • Matcha antalet with(...) argument med tillgängliga konstruktoröverlagringar (CS9359).

Ogiltig matrisrankning

  • CS0178: Ogiltig rangspecificerare: förväntad "," eller "]"
  • CS0650: Felaktig matrisdeklarator: Om du vill deklarera en hanterad matris föregår rankningsspecificeraren variabelns identifierare. Om du vill deklarera ett buffertfält med fast storlek använder du det fasta nyckelordet före fälttypen.
  • CS1552: Matristypsspecificerare, [], måste visas före parameternamnet

Om du vill deklarera matriser korrekt följer du rätt syntaxordning. Mer information finns i Matriser och avsnittet C#-språkspecifikation om matrisinitierare.

En matrisdeklaration består av dessa token i ordning:

  1. Typ av matriselement (till exempel int, stringeller SomeClassType).
  2. Arrayparenteser, som kan inkludera kommatecken för flera dimensioner.
  3. Variabelnamnet.

När du anger matrisdimensioner kan du använda:

  • Ett antal element i klammerparenteser ({ och })
  • Tomma hakparenteser
  • Ett eller flera kommatecken inom hakparenteser

I följande exempel visas giltiga matrisdeklarationer:

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

Ogiltig matrislängd

  • CS0248: Det går inte att skapa en matris med en negativ storlek
  • CS0270: Matrisstorleken kan inte anges i en variabeldeklaration (försök initiera med ett "nytt" uttryck)
  • CS1586: Matrisskapandet måste ha matrisstorlek eller matrisinitierare

Om du vill skapa matriser med giltiga längder anger du storleken under initieringen, inte deklarationen. Mer information finns i Matriser.

  • Ange matrislängd som en del av initieringen, inte deklarationen (CS0270).
  • Använd endast positiva heltal för matrisdimensioner (CS0248).
  • Ange antingen en storlek i ett new uttryck eller en matrisinitierare (CS1586).

I följande exempel visas båda mekanismerna:

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

Ogiltig elementtyp

  • CS0611: Matriselement kan inte vara av typen "typ"
  • CS0719: Matriselement kan inte vara av statisk typ
  • CS0820: Det går inte att tilldela matrisinitierare till en implicit skriven lokal
  • CS0826: Ingen bästa typ hittades för implicit typ av matris

Följ dessa typbegränsningar om du vill använda matriser med rätt elementtyper. Mer information finns i Implicit typsatta lokala variabler och bästa gemensamma typ.

  • Använd inte begränsade typer som System.TypedReference och System.ArgIterator som matriselementtyper (CS0611).
  • Använd static inte klasser som matriselementtyper eftersom instanser inte kan skapas (CS0719).
  • Initiera implicit inskrivna matriser med ett new uttryck (CS0820).
  • Se till att alla element i en implicit typad matrisinitierare har en bästa gemensam typ (CS0826).

I följande exempel visas hur du deklarerar implicit inskrivna matriser:

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 };

Använd någon av följande tekniker för att säkerställa den bästa gemensamma typen:

  • Ge matrisen en explicit typ.
  • Ge alla matriselement samma typ.
  • Ange explicita avgjutningar av element som kan orsaka problemet.

Ogiltig matrisinitierare

  • CS0623: Matrisinitierare kan endast användas i en variabel eller fältinitierare. Prova att använda ett nytt uttryck i stället.
  • CS0846: En kapslad matrisinitierare förväntas
  • CS1925: Det går inte att initiera objekt av typen "typ" med en samlingsinitierare.

Dessa fel indikerar ogiltig syntax för matrisinitierare. Mer information finns i Matriser.

Så här skapar du giltiga matrisinitierare:

  • Använd endast matrisinitierare i variabel- eller fältdeklarationer (CS0623). Använd ett new uttryck i andra kontexter.
  • Balansera klammerparenteser ({ och }) runt element eller underordnade matriser (CS0846).
  • Kontrollera att initieringsuttrycket matchar antalet matriser i en ojämn matrisinitiering.
  • Använd endast insamlingsinitierare med samlingstyper, inte med matriser eller andra typer (CS1925).

Ogiltig samlingsbyggare

  • CS9175: Ett uttrycksträd får inte innehålla ett samlingsuttryck.
  • CS9177: Builder-metoden "CollectionBuilderAttribute" måste ha en returtyp som matchar samlingstypen som används i 'förbättring'.
  • CS9178: Det finns ingen måltyp för den naturliga typen "typ".
  • CS9179: Samlingsuttryckstypen måste ha en tillämplig konstruktor som kan anropas utan argument.
  • CS9180: Builder-metoden "CollectionBuilderAttribute" måste vara en statisk metod.
  • CS9181: Parametertypen CollectionBuilderAttribute-metoden måste matcha parametern ReadOnlySpan<{0}>
  • CS9182: Ogiltigt "CollectionBuilderAttribute". Ingen matchande metod{0} hittades på builder-typen .{1}
  • CS9183: Returtypen "CollectionBuilderAttribute" måste vara en icke-abstrakt, icke-gränssnittstyp som kan användas som en typ
  • CS9185: En statisk typ kan inte användas som ett typargument.
  • CS9186: Metodnamnet CollectionBuilderAttribute är ogiltigt.
  • CS9187: Det gick inte att hitta en tillgänglig "Skapa"-metod med den förväntade signaturen: en statisk metod med en enda parameter av typen "ReadOnlySpan<{0}>" och returtypen "{1}".
  • CS9188: "scoped" kan inte användas som en modifierare för en parameter av samlingsuttryckstyp.
  • CS9190: Metoden "CollectionBuilderAttribute" "builderMethod" är inte tillämplig eftersom den är generisk.
  • CS9192: Infogade matriskonverteringar kan inte användas med samlingsuttryck.
  • CS9193: Argumentet "argument" får inte skickas med nyckelordet ref.
  • CS9194: Argumentet "argument" får inte skickas med nyckelordet "out"
  • CS9195: Argumentet "argument" kanske inte skickas med nyckelordet "in"
  • CS9196: Funktionen "samlingsuttryck" är inte tillgänglig i C# "version". Använd språkversionen "requiredVersion" eller senare.
  • CS9197: Funktionen "infogade matriser" är inte tillgänglig i C# "version". Använd språkversionen "requiredVersion" eller senare.
  • CS9198: Funktionen "referens och osäker i asynkronisering och iteratormetoder" är inte tillgänglig i C#-versionen. Använd språkversionen "requiredVersion" eller senare.
  • CS9199: Funktionen "samlingsuttryck" är inte tillgänglig i C# "version". Använd språkversionen "requiredVersion" eller senare.
  • CS9202: Funktionen "referens-skrivskyddade parametrar" är inte tillgängliga i C#-versionen. Använd språkversionen "requiredVersion" eller senare.
  • CS9208: "nameof"-operatorn kan inte användas på en infogad matrisåtkomst.
  • CS9209: En egenskap med referensretur "egenskap" kan inte användas som ett värdeargument.
  • CS9211: Uttrycket måste vara av typen "typ" eftersom det tilldelas av referens
  • CS9212: Det går inte att använda samlingsuttrycket som värde i en fast instruktion
  • CS9217: En lokal referens kan inte bevaras över gränsen "await" eller "yield".
  • CS9218: "paramName" är en referens struct och kan inte vara typen av en parameter
  • CS9221: Typen "typ" får inte vara en ref struct eller en typparameter som tillåter ref structs för att användas som parameter "parameter" i den generiska typen eller metoden "member".
  • CS9223: En struct som innehåller referensfält kan inte användas i ett samlingsuttryck.
  • CS9228: Icke-variabeldeklaration av en referens-struct tillåts inte
  • CS9232: Partiella metoddeklarationer har signaturskillnader.
  • CS9233: "Filmodifieraren" kan endast användas på typer som definierats på den översta nivån i en kompileringsenhet

Följ dessa krav om du vill skapa samlingsuttryck med collection builder-attribut på rätt sätt. Mer information finns i Samlingsuttryck.

  • Kontrollera att måltypen har en iterationstyp som stöder foreach (CS9188).
  • Använd inte generiska typer som samlingsbyggare (CS9185).
  • Kontrollera att metodnamnet som anges i CollectionBuilderAttribute är giltigt (CS9186).
  • Använd CollectionBuilderAttribute endast med statiska metoder som matchar den obligatoriska signaturen: returnera samlingstypen och ta en ReadOnlySpan<T> parameter där T matchar elementtypen (CS9180, CS9181, CS9182, CS9183, CS9187, CS9190).
  • Kontrollera att returtypen matchar och inte är abstrakt eller ett gränssnitt (CS9177, CS9183).
  • Använd inte referensstrukturer eller typer med referensfält i samlingsuttryck (CS9218, CS9221, CS9223, CS9228).
  • Undvik att använda samlingsuttryck i uttrycksträd (CS9175).
  • Använd rätt språkversion för samlingsuttryck och relaterade funktioner (CS9196, CS9197, CS9198, CS9199, CS9202).

Vanliga språkspecifikationsvarningar

  • CS3007: Överlagrad metod som endast skiljer sig från icke namngivna matristyper är inte CLS-kompatibel
  • CS3016: Matriser som attributargument är inte CLS-kompatibla

Följ dessa riktlinjer om du vill skriva CLS-kompatibel kod med matriser. Mer information finns i Språkberoende.

  • Skapa inte överlagrade metoder som bara skiljer sig åt i matriselementtyper (CS3007).
  • Använd inte matriser som attributargument (CS3016).

CS3007 inträffar om du har en överlagrad metod som tar en ojämn matris och den enda skillnaden mellan metodsignaturerna är matrisens elementtyp. Om du vill undvika det här felet bör du överväga att använda en rektangulär matris i stället för en ojämn matris, eller ta bort CLSCompliantAttribute attributet om CLS-efterlevnad inte behövs. Mer information om CLS-efterlevnad finns i Språkoberoende och språkoberoende komponenter.

CS3016 anger att den inte är kompatibel med COMMON Language Specification (CLS) för att skicka en matris till ett attribut. Mer information om CLS-efterlevnad finns i Språkoberoende och språkoberoende komponenter.