Delen via


Fouten en waarschuwingen die zijn gekoppeld aan ref struct typen

  • CS8343: ref structs kan geen interfaces implementeren
  • CS8344: foreach instructie kan niet worden uitgevoerd op enumerators in asynchrone of iteratormethoden omdat het type een ref struct of een typeparameter is die het mogelijk maakt ref struct.
  • CS8345: De eigenschap Veld of automatisch geïmplementeerd kan niet van het type zijn, tenzij het een exemplaarlid van een ref struct.
  • CS9048: De scoped wijzigingsfunctie kan alleen worden gebruikt voor refs en ref struct waarden.
  • CS9050: Een ref veld kan niet verwijzen naar een ref struct.
  • CS9059: Een verwveld kan alleen worden gedeclareerd in een verw-struct.
  • CS9241: 'ref struct' is al opgegeven.
  • CS9242: De component 'allows' moet de laatste beperking zijn opgegeven.
  • CS9243: Kan verw-structs niet toestaan voor een typeparameter die bekend is van andere beperkingen als klasse.
  • CS9244: Het type is ref struct mogelijk geen of een typeparameter waarmee verw-structs kunnen worden gebruikt als parameter in het algemene type of de methode.
  • CS9245: Type kan geen interfacelid voor ref struct type implementeren.
  • CS9246: Een niet-virtueel exemplaarinterfacelid kan niet worden geopend op een typeparameter die refstruct toestaat.
  • CS9247: foreach-instructie kan niet worden uitgevoerd op enumerators van het type omdat het een typeparameter is die refstruct toestaat en het niet bekend is tijdens het compileren om te implementeren IDisposable.
  • CS9267: Elementtype van een iterator is mogelijk geen refstruct of een typeparameter die ref-structs toestaat

schendingen van de veiligheid van ref

  • CS8345: De eigenschap Veld of automatisch geïmplementeerd kan niet van het type zijn, tenzij het een exemplaarlid van een ref struct.
  • CS9048: De scoped wijzigingsfunctie kan alleen worden gebruikt voor refs en ref struct waarden.
  • CS9050: Een ref veld kan niet verwijzen naar een ref struct.
  • CS9059: Een ref veld kan alleen worden gedeclareerd in een ref struct.

Een ref struct type kan velden bevatten ref . Andere typen zijn geen velden toegestaan ref . De compiler dwingt beperkingen af voor de declaraties en het gebruik van ref struct typen om ref-veiligheidsregels af te dwingen voor exemplaren van elk ref struct type:

  • Alleen ref struct typen kunnen automatisch geïmplementeerde ref eigenschappen bevatten.
  • Alleen ref struct typen of ref variabelen kunnen de scoped wijzigingsfunctie hebben.
  • Een ref veld kan alleen in een ref struct type worden gedeclareerd.
  • Een ref veld kan niet verwijzen naar een ref struct type/

Het schenden van een van deze regels produceert een van de vermelde fouten. Als u deze taalfunctie wilt gebruiken, converteert u het type naar een ref struct. Verwijder anders de niet-toegestane constructie.

ref struct interface-implementaties

  • CS8343: ref structs kan geen interfaces implementeren
  • CS8344: foreach instructie kan niet worden uitgevoerd op enumerators in asynchrone of iteratormethoden omdat het type een ref struct of een typeparameter is die het mogelijk maakt ref struct.
  • CS9241: 'ref struct' is al opgegeven.
  • CS9242: De component 'allows' moet de laatste beperking zijn opgegeven.
  • CS9243: Kan verw-structs niet toestaan voor een typeparameter die bekend is van andere beperkingen als klasse.
  • CS9244: Het type is ref struct mogelijk geen of een typeparameter waarmee verw-structs kunnen worden gebruikt als parameter in het algemene type of de methode.
  • CS9245: Type kan geen interfacelid voor ref struct type implementeren.
  • CS9246: Een niet-virtueel exemplaarinterfacelid kan niet worden geopend op een typeparameter die refstruct toestaat.
  • CS9247: foreach-instructie kan niet worden uitgevoerd op enumerators van het type omdat het een typeparameter is die refstruct toestaat en het niet bekend is tijdens het compileren om te implementeren IDisposable.
  • CS9267: Elementtype van een iterator is mogelijk geen refstruct of een typeparameter die ref-structs toestaat

Vóór C# 13 ref struct kunnen typen geen interfaces implementeren. De compiler genereert CS8343. Vanaf C# 13 ref struct kunnen typen interfaces implementeren, afhankelijk van de volgende regels:

  • Een ref struct kan niet worden geconverteerd naar een instantie van een interface die wordt geïmplementeerd. Deze beperking omvat de impliciete conversie wanneer u een ref struct type als argument gebruikt wanneer de parameter een interfacetype is. De conversie resulteert in een boksconversie, die de veiligheid van ref schendt.
  • Een ref struct die een interface implementeert, moet alle interfaceleden implementeren. De ref struct implementatie moet leden implementeren waarbij de interface een standaard implementatie bevat.

Vanaf C# 13 kan een ref struct worden gebruikt als een typeargument voor een algemene typeparameter, als en alleen als de algemene typeparameter de allows ref struct antibeperking heeft. Wanneer u de allows ref struct antibeperking gebruikt, moet u de volgende regels volgen:

  • A ref struct wordt gebruikt als een typeargument, de typeparameter moet de allows ref struct antibeperking hebben.- De allows ref struct antibeperking moet het laatste zijn in de where component voor die parameter
  • Het gebruik van exemplaren van de typeparameter moet voldoen aan de veiligheidsregels voor ref.
  • Een ref struct of een typeargument dat een ref struct type kan zijn, kan niet worden gebruikt als het elementtype voor een iterator-methode.