Partager via


Prise en charge de UnsafeAccessor modifiée pour les génériques fermés

.NET 8 a introduit l’attribut UnsafeAccessorAttribute, qui permet d’accéder à des membres non visibles de types (c’est-à-dire « réflexion privée rapide »). La prise en charge des génériques dans .NET 8 n’a pas été ajoutée en raison de contraintes de temps. Toutefois, dans CoreCLR et AOT natif, certains scénarios très étroits et non pris en charge impliquant des types génériques fermés fonctionnaient. Ces scénarios auraient dû été bloqués, mais ne l’étaient pas, par inadvertance. De nouvelles restrictions ont été ajoutées dans .NET 9.

Pour plus d’informations et d’exemples, consultez les remarques relatives à UnsafeAccessorAttribute.

Comportement précédent

Dans .NET 8, une recherche naïve de signature sur les types a été implémentée et l’utilisation de types génériques a été considérée comme valide dans certains cas. Par exemple, le code suivant a réussi :

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

Nouveau comportement

À compter de .NET 9, la méthode entièrement prise en charge et documentée pour consommer des types génériques consiste à garantir que les paramètres de type d’une méthode extern static correspondent aux paramètres de type de la méthode privée, et que les paramètres de méthode d’une méthode extern static correspondent aux paramètres de méthode de la méthode privée. Ces restrictions sont nécessaires, car le runtime effectue une correspondance stricte de la signature de métadonnées.

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

Version introduite

.NET 9 Preview 6

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Dans la version officielle de .NET 8, la prise en charge de l’utilisation de types génériques avec UnsafeAccessorAttribute n’était pas intentionnelle. Au début du développement, il s’agissait d’un scénario pouvant être pris en charge, mais il a été reporté ultérieurement jusqu’à .NET 9, car l’équipe a rencontré des problèmes de complexité. La documentation officielle n’a pas mentionné les génériques et n’a pas non plus fourni d’exemples utilisant des génériques. Cette modification corrige le comportement.

Lisez la documentation mise à jour de l’API UnsafeAccessorAttribute et modifiez votre code si nécessaire pour qu’il corresponde aux nouvelles restrictions pour les types génériques.

API affectées