Delen via


OnveiligeAccessor-ondersteuning voor gesloten generics gewijzigd

.NET 8 heeft het UnsafeAccessorAttribute kenmerk geïntroduceerd, waarmee toegang wordt verleend tot niet-zichtbare leden van typen (ook wel 'snelle privé weerspiegeling' genoemd). Ondersteuning voor generics in .NET 8 is niet toegevoegd vanwege tijdsbeperkingen. In CoreCLR en systeemeigen AOT werkten enkele zeer smalle en niet-ondersteunde scenario's met gesloten algemene typen. Deze scenario's zouden moeten zijn geblokkeerd, maar per ongeluk niet. Er zijn nieuwe beperkingen toegevoegd in .NET 9.

Zie de opmerkingen voor UnsafeAccessorAttribute voor meer informatie en voorbeelden.

Vorig gedrag

In .NET 8 is een naïve handtekeningzoekactie voor typen geïmplementeerd en werd het gebruik van algemene typen in sommige gevallen als geldig beschouwd. De volgende code is bijvoorbeeld geslaagd:

[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);

Nieuw gedrag

Vanaf .NET 9 is de volledig ondersteunde en gedocumenteerde manier om algemene typen te gebruiken ervoor te zorgen dat de typeparameters van een extern static methode overeenkomen met de typeparameters van de privémethode en dat de methodeparameters van een extern static methode overeenkomen met de methodeparameters van de privémethode. Deze beperkingen zijn nodig omdat de runtime een strikte overeenkomst met metagegevenshandtekening uitvoert.

class Accessor<T>
{
    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
    public extern static void CtorAsMethod(List<T> c);
}

Versie geïntroduceerd

.NET 9 Preview 6

Type wijziging die fouten veroorzaken

Deze wijziging is een gedragswijziging.

Reden voor wijziging

In de officiële .NET 8-release was de ondersteuning voor het gebruik van algemene typen UnsafeAccessorAttribute onbedoeld. Vroeg in ontwikkeling was het mogelijk een ondersteund scenario, maar werd later uitgesteld tot .NET 9 omdat het team complexiteitsproblemen heeft ondervonden. De officiële documentatie vermeldde geen generieken, en gaf geen voorbeelden met behulp van generieken. Deze wijziging corrigeert het gedrag.

Lees de bijgewerkte documentatie voor de UnsafeAccessorAttribute API en wijzig uw code indien nodig om te voldoen aan de nieuwe beperkingen voor algemene typen.

Betrokken API's