Freigeben über


Geänderte UnsafeAccessor-Unterstützung für geschlossene Generics

.NET 8 hat das UnsafeAccessorAttribute-Attribut eingeführt, das den Zugriff auf nicht sichtbare Typmember ermöglicht, was auch als schnelle private Reflexion bezeichnet wird. Die Unterstützung für Generics in .NET 8 wurde aufgrund von Zeitbeschränkungen nicht hinzugefügt. In CoreCLR und nativer AOT funktionierten jedoch einige sehr schlanke und nicht unterstützte Szenarios mit geschlossenen generischen Typen. Diese Szenarios hätten blockiert werden sollen, wurden es aber versehentlich nicht. In .NET 9 wurden neue Einschränkungen hinzugefügt.

Weitere Informationen und Beispiele finden Sie in den Anmerkungen zu UnsafeAccessorAttribute.

Vorheriges Verhalten

In .NET 8 wurde eine native Signatursuche für Typen implementiert, und die Verwendung generischer Typen wurde in einigen Fällen als gültig erklärt. Beispielsweise konnte der folgende Code ausgeführt werden:

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

Neues Verhalten

Ab .NET 9 besteht die vollständig unterstützte und dokumentierte Methode zum Verwenden generischer Typen darin, sicherzustellen, dass die Typparameter einer extern static-Methode den Typparametern der privaten Methode und die Methodenparameter einer extern static-Methode den Methodenparametern der privaten Methode entsprechen. Diese Einschränkungen sind erforderlich, da die Runtime mit einer strengen Übereinstimmung mit der Metadatensignatur ausgeführt wird.

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

Eingeführt in Version

.NET 9 Preview 6

Typ des Breaking Changes

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Im offiziellen .NET 8-Release war die Unterstützung für die Verwendung generischer Typen mit UnsafeAccessorAttribute nicht beabsichtigt. Zu Beginn der Entwicklung handelte es sich um ein möglicherweise unterstütztes Szenario, wurde jedoch später bis .NET 9 zurückgestellt, da das Team Probleme mit der Komplexität hatte. Die offizielle Dokumentation erwähnte weder Generics noch Beispiele, bei denen diese verwendet werden. Diese Änderung korrigiert das Verhalten.

Lesen Sie die aktualisierte Dokumentation für die UnsafeAccessorAttribute-API, und ändern Sie den Code nach Bedarf, damit er den neuen Einschränkungen für generische Typen entspricht.

Betroffene APIs