Delen via


Fouten en waarschuwingen in matrix- en verzamelingsdeclaraties en initialisatie-expressies oplossen

In dit artikel worden de volgende compilerfouten behandeld:

  • CS0022: Onjuist aantal indexen binnen [], verwacht 'getal'
  • CS0178: Ongeldige rangschikkingsaanduiding: verwacht ',' of ']'
  • CS0248: Kan geen matrix maken met een negatieve grootte
  • CS0270: Matrixgrootte kan niet worden opgegeven in een variabeledeclaratie (initialiseren met een 'new'-expressie)
  • CS0611: Matrixelementen kunnen niet van het type zijn
  • CS0623: Initializers van matrix kunnen alleen worden gebruikt in een variabele of veld-initialisatiefunctie. Gebruik in plaats daarvan een nieuwe expressie.
  • CS0650: Ongeldige matrixdeclaratie: Als u een beheerde matrix wilt declareren, gaat de rangaanduiding vooraf aan de id van de variabele. Als u een bufferveld met een vaste grootte wilt declareren, gebruikt u het vaste trefwoord voor het veldtype.
  • CS0719: Matrixelementen kunnen niet van het statische type zijn
  • CS0747: Ongeldige initialisatieliddeclaratie.
  • CS0820: Kan de initialisatiefunctie van de matrix niet toewijzen aan een impliciet getypt lokaal
  • CS0826: Geen beste type gevonden voor impliciet getypte matrix.
  • CS0846: Er wordt een geneste matrix-initialisatiefunctie verwacht
  • CS1063: De best overbelaste add-methode voor het element collection initializer is verouderd.
  • CS1552: Matrixtypeaanduiding, []moet worden weergegeven vóór de parameternaam
  • CS1586: Het maken van een matrix moet een matrixgrootte of -initialisatiefunctie hebben
  • CS1920: Initialisatiefunctie voor elementen mag niet leeg zijn.
  • CS1921: De best overbelaste methodeovereenkomst heeft een verkeerde handtekening voor het initialisatie-element. De initialiseerbare Add methode moet een toegankelijke instantiemethode zijn.
  • CS1925: Kan het object van het type 'type' niet initialiseren met een initialisatiefunctie voor verzamelingen.
  • CS1950: De best overbelaste add-methode voor de initialisatiefunctie van de verzameling heeft een aantal ongeldige argumenten.
  • CS1954: De best overbelaste methode komt overeen met het element voor de initialisatie van de verzameling kan niet worden gebruikt. Methoden voor de initialisatiefunctieAdd voor verzamelingen kunnen geen parameters out of parameters hebbenref.
  • CS9174: Kan het type niet initialiseren met een letterlijke verzameling omdat het type niet kan worden samengesteld.
  • CS9176: Er is geen doeltype voor de letterlijke verzameling.
  • CS9185: Het type CollectionBuilderAttribute builder moet een niet-algemene klasse of struct zijn.
  • CS9186: de naam van de methode CollectionBuilderAttribute is ongeldig.
  • CS9187: Kan geen toegankelijke methode vinden met de verwachte handtekening: een statische methode met één parameter van het type ReadOnlySpan<T>; en het juiste retourtype
  • CS9188: Type heeft een CollectionBuilderAttribute maar geen elementtype.
  • CS9203: Een verzamelingsexpressie van dit type kan niet worden gebruikt in deze context omdat deze mogelijk buiten het huidige bereik wordt weergegeven.
  • CS9210: Deze versie kan System.Collections.Immutable.ImmutableArray<T>niet worden gebruikt met verzamelingsexpressies.

Daarnaast worden de volgende waarschuwingen in dit artikel behandeld:

  • CS1062: De best overbelaste add-methode voor het element collection initializer is verouderd.
  • CS1064: De best overbelaste add-methode voor het element collection initializer is verouderd.
  • CS3007: Overbelaste methode 'methode' verschilt alleen door niet-benoemde matrixtypen is niet CLS-compatibel
  • CS3016: Matrices als kenmerkargumenten zijn niet CLS-compatibel
  • CS0251: Een matrix indexeren met een negatieve index (matrixindexen beginnen altijd bij nul)
  • CS9208: Verzamelingsexpressie kan onverwachte heap-toewijzingen hebben. Overweeg expliciet een matrix te maken en vervolgens te converteren naar het uiteindelijke type om de toewijzing expliciet te maken.
  • CS9209: Verzamelingsexpressie kan onverwachte heap-toewijzingen met zich meebrengt vanwege het gebruik van '..' spreads. Overweeg expliciet een matrix te maken en vervolgens te converteren naar het uiteindelijke type om de toewijzing expliciet te maken.

In de volgende artikelen vindt u meer informatie over matrices, initialisatiefunctie voor verzamelingen en verzamelingexpressies:

Ongeldige initialisatiefunctie voor verzameling

De volgende fouten geven aan dat de code die is gegenereerd door de compiler voor een initialisatiefunctie voor verzamelingen ongeldig is:

  • CS0747: Ongeldige initialisatieliddeclaratie.
  • CS1063: De best overbelaste add-methode voor het element collection initializer is verouderd.
  • CS1920: Initialisatiefunctie voor elementen mag niet leeg zijn.
  • CS1921: De best overbelaste methodeovereenkomst heeft een verkeerde handtekening voor het initialisatie-element. De initialiseerbare Add methode moet een toegankelijke instantiemethode zijn.
  • CS1950: De best overbelaste add-methode voor de initialisatiefunctie van de verzameling heeft een aantal ongeldige argumenten.
  • CS1954: De best overbelaste methode komt overeen met het element voor de initialisatie van de verzameling kan niet worden gebruikt. Methoden voor de initialisatiefunctieAdd voor verzamelingen kunnen geen parameters out of parameters hebbenref.
  • CS9174: Kan het type niet initialiseren met een letterlijke verzameling omdat het type niet kan worden samengesteld.
  • CS9176: Er is geen doeltype voor de letterlijke verzameling.
  • CS9203: Een verzamelingsexpressie van dit type kan niet worden gebruikt in deze context omdat deze mogelijk buiten het huidige bereik wordt weergegeven.
  • CS9210: Deze versie kan System.Collections.Immutable.ImmutableArray<T>niet worden gebruikt met verzamelingsexpressies.

De compiler kan ook de volgende waarschuwing genereren:

  • CS1062: De best overbelaste add-methode voor het element collection initializer is verouderd.
  • CS1064: De best overbelaste add-methode voor het element collection initializer is verouderd.
  • CS9208: Verzamelingsexpressie kan onverwachte heap-toewijzingen hebben. Overweeg expliciet een matrix te maken en vervolgens te converteren naar het uiteindelijke type om de toewijzing expliciet te maken.
  • CS9209: Verzamelingsexpressie kan onverwachte heap-toewijzingen met zich meebrengt vanwege het gebruik van '..' spreads. Overweeg expliciet een matrix te maken en vervolgens te converteren naar het uiteindelijke type om de toewijzing expliciet te maken.

De fouten geven allemaal aan dat de code die door de compiler voor een initialisatiefunctie voor verzamelingen is gegenereerd, ongeldig is. Controleer het volgende:

  • Een initialisatiefunctie voor verzamelingen bevat een reeks elementen. U kunt instellingseigenschappen voor het verzamelingsexemplaren niet combineren met het toevoegen van elementen in dezelfde initialisatiefunctie.
  • Een initialisatiefunctie voor verzamelingen die accolades ({ en }) bevat, mag niet leeg zijn.
  • De klasse moet IEnumerable implementeren en een openbare Add methode hebben.
  • Een conforme Add methode moet toegankelijk zijn en één parameter gebruiken die hetzelfde type is als de verzamelingselementen. De parameter kan de ref of out modifier niet bevatten.
  • Overbelastingsresolutie moet één Add methode kiezen als een betere overeenkomst. Er kunnen niet meerdere overeenkomende methoden zijn die even goed zijn.
  • Verzamelingsexpressies kunnen expliciet getypte variabelen van een verzamelingstype initialiseren. Als de variabele geen verzameling of matrixtype is of impliciet is getypt (met), varkan er geen initialisatiefunctie voor verzamelingen worden gebruikt.
  • Een ref struct type, zoals System.Span<T> kan niet worden geïnitialiseerd met een verzamelingsexpressie die de veiligheid van ref kan schenden.
  • Een verzamelingsexpressie kan een System.Collections.Immutable.ImmutableArray<T> verzameling niet correct initialiseren met behulp van de huidige versie. Gebruik een andere versie van de runtime of wijzig de initialisatie-expressie.

De waarschuwingen geven aan dat de verzamelingsexpressie, inclusief eventuele verspreide elementen , geheugen kan toewijzen. Het maken van verschillende opslag en conversie kan efficiënter zijn.

Ongeldige initialisatiefunctie voor matrices

  • CS0623: Initializers van matrix kunnen alleen worden gebruikt in een variabele of veld-initialisatiefunctie. Gebruik in plaats daarvan een nieuwe expressie.
  • CS0846: Er wordt een geneste matrix-initialisatiefunctie verwacht
  • CS1925: Kan het object van het type 'type' niet initialiseren met een initialisatiefunctie voor verzamelingen.

Deze fouten geven aan dat u een ongeldige initialisatiefunctie hebt gemaakt. De waarschijnlijke oorzaak is onevenwichtige accolades { en } rond een of meer elementen of onderliggende matrices. Zorg ervoor dat de initialisatie-expressie overeenkomt met het aantal matrices in een initialisatie van een gelabelde matrix en dat de accolades evenwichtig zijn.

Ongeldige toegang tot matrixelementen

  • CS0022: Onjuist aantal indexen binnen [], verwacht 'getal'
  • CS0251: Een matrix indexeren met een negatieve index (matrixindexen beginnen altijd bij nul)

U opent een element van een matrix door de index op te geven voor elke as die in de matrix is gedeclareerd. De indexen bevinden zich tussen [ en ] na de matrixnaam. Er zijn twee regels voor de matrixindexen:

  1. U moet hetzelfde aantal indexen opgeven als in de matrixdeclaratie. Als de matrix één dimensie heeft, moet u één index opgeven. Als de matrix drie dimensies heeft, moet u drie indexen opgeven.
  2. Alle indexen moeten niet-negatieve gehele getallen zijn.

Ongeldige matrixrang

  • CS0178: Ongeldige rangschikkingsaanduiding: verwacht ',' of ']'
  • CS0650: Ongeldige matrixdeclaratie: Als u een beheerde matrix wilt declareren, gaat de rangaanduiding vooraf aan de id van de variabele. Als u een bufferveld met een vaste grootte wilt declareren, gebruikt u het vaste trefwoord voor het veldtype.
  • CS1552: Matrixtypeaanduiding, []moet worden weergegeven vóór de parameternaam

Een matrixdeclaratie bestaat uit de volgende tokens, in volgorde:

  1. Het type matrixelementen. Bijvoorbeeld int, string of SomeClassType.
  2. De matrixhaken, eventueel komma's om meerdere dimensies weer te geven.
  3. De naam van de variabele.

Wanneer een matrix initialisatie de matrixdimensies opgeeft, kunt u de volgende eigenschappen opgeven:

  • Een aantal elementen in accolades ({ en })
  • Lege vierkante haken
  • Een of meer komma's tussen haakjes

Het volgende zijn bijvoorbeeld geldige matrixdeclaraties:

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

Zie de sectie C#-specificatie (C#-taalspecificatie) over matrix-initialisatieprogramma's voor meer informatie.

Ongeldige matrixlengte

  • CS0248: Kan geen matrix maken met een negatieve grootte
  • CS0270: Matrixgrootte kan niet worden opgegeven in een variabeledeclaratie (initialiseren met een 'nieuwe' expressie
  • CS1586: Het maken van een matrix moet een matrixgrootte of -initialisatiefunctie hebben

De lengte van elke dimensie van een matrix moet worden opgegeven als onderdeel van de initialisatie van de matrix, niet als declaratie. De lengte van elke dimensie moet positief zijn. U kunt de lengte opgeven met behulp van een new expressie om de matrix toe te wijzen of met behulp van een matrix-initialisatiefunctie om alle elementen toe te wijzen. In het volgende voorbeeld ziet u beide mechanismen:

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

Ongeldig elementtype

  • CS0611: Matrixelementen kunnen niet van het type 'type' zijn
  • CS0719: Matrixelementen kunnen niet van het statische type zijn
  • CS0820: Kan de initialisatiefunctie van de matrix niet toewijzen aan een impliciet getypt lokaal
  • CS0826: Geen beste type gevonden voor impliciet getypte matrix.

Er zijn enkele typen die niet kunnen worden gebruikt als het type matrix. Deze typen omvatten System.TypedReference en System.ArgIterator. Het type matrix kan geen klasse zijn static , omdat exemplaren van een static klasse niet kunnen worden gemaakt.

U kunt matrices declareren als impliciet getypte lokale variabelen. De matrix moet worden geïnitialiseerd met behulp van een new expressie. Bovendien moeten alle elementen in een matrix-initialisatiefunctie een best gemeenschappelijk type hebben. In de volgende voorbeelden ziet u hoe u een impliciet getypte matrix declareert:

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

U kunt ervoor zorgen dat het beste algemene type wordt gebruikt met behulp van een van de volgende technieken:

  • Geef de matrix een expliciet type.
  • Geef alle matrixelementen hetzelfde type.
  • Geef expliciete casts op die elementen die het probleem kunnen veroorzaken.

Ongeldige opbouwfunctie voor verzamelingen

De volgende fouten geven fouten aan in het type opbouwfunctie voor verzamelingen:

  • CS9185: Het CollectionBuilderAttribute type opbouwfunctie moet een niet-algemene klasse of struct zijn.
  • CS9186: De naam van de CollectionBuilderAttribute methode is ongeldig.
  • CS9187: Kan geen toegankelijke methode vinden met de verwachte handtekening: een statische methode met één parameter van het type ReadOnlySpan<T>; en het juiste retourtype.
  • CS9188: Type heeft een CollectionBuilderAttribute maar geen elementtype.

Deze fouten geven aan dat het type opbouwfunctie voor verzamelingen moet worden gewijzigd. Onthoud de volgende regels:

  • Het verzamelingstype moet een iteratietype hebben. Met andere woorden, u kunt foreach het type als een verzameling.
  • Het type opbouwfunctie voor verzamelingen kan geen algemeen type zijn.
  • De naam van de methode die op de System.Runtime.CompilerServices.CollectionBuilderAttribute methode is opgegeven, moet een geldige methodenaam zijn. Het kan bijvoorbeeld geen finalizer zijn of een andere naam die ongeldige id-tekens bevat.
  • De opbouwmethode voor verzamelingen moet een toegankelijke statische methode zijn. Het moet het verzamelingstype retourneren en er moet een parameter worden gebruikt waarvan ReadOnlySpan<T> T het elementtype van de verzameling overeenkomt.

Algemene waarschuwingen voor taalspecificaties

  • CS3007: Overbelaste methode 'methode' verschilt alleen door niet-benoemde matrixtypen is niet CLS-compatibel
  • CS3016: Matrices als kenmerkargumenten zijn niet CLS-compatibel

CS3007 treedt op als u een overbelaste methode hebt die een gelabelde matrix gebruikt en het enige verschil tussen de methodehandtekeningen het elementtype van de matrix is. U kunt deze fout voorkomen door een rechthoekige matrix te gebruiken in plaats van een gelabelde matrix of als CLS-naleving niet nodig is, verwijdert u het CLSCompliantAttribute kenmerk. Zie Taalonafhankelijkheid en taalonafhankelijke onderdelen voor meer informatie over CLS-naleving.

CS3016 geeft aan dat het niet voldoet aan de Common Language Specification (CLS) om een matrix door te geven aan een kenmerk. Zie Taalonafhankelijkheid en taalonafhankelijke onderdelen voor meer informatie over CLS-naleving.