Obsługa altered UnsafeAccessor dla zamkniętych typów ogólnych
Platforma .NET 8 wprowadziła UnsafeAccessorAttribute atrybut, który zezwala na dostęp do niewidocznych elementów członkowskich typów (AKA "szybkie odbicie prywatne"). Obsługa typów ogólnych na platformie .NET 8 nie została dodana z powodu ograniczeń czasowych. Jednak w rdzeniach CoreCLR i natywnym AOT niektóre bardzo wąskie i nieobsługiwane scenariusze obejmujące zamknięte typy ogólne działały. Te scenariusze powinny zostać zablokowane, ale przypadkowo nie były. Nowe ograniczenia zostały dodane na platformie .NET 9.
Aby uzyskać więcej informacji i przykładów, zobacz uwagi dotyczące niebezpiecznej funkcjiAccessorAttribute.
Poprzednie zachowanie
W programie .NET 8 zaimplementowano naiwne wyszukiwanie podpisów dla typów, a użycie typów ogólnych zostało uznane za prawidłowe w niektórych przypadkach. Na przykład następujący kod zakończył się pomyślnie:
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);
Nowe zachowanie
Począwszy od platformy .NET 9, w pełni obsługiwany i udokumentowany sposób korzystania z typów ogólnych polega na upewnieniu się, że parametry typu metody są zgodne z parametrami extern static
typu metody prywatnej, a parametry metody są zgodne z parametrami extern static
metody prywatnej. Te ograniczenia są niezbędne, ponieważ środowisko uruchomieniowe wykonuje ścisłe dopasowanie podpisu metadanych.
class Accessor<T>
{
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
public extern static void CtorAsMethod(List<T> c);
}
Wprowadzona wersja
.NET 9 (wersja zapoznawcza 6)
Typ zmiany powodującej niezgodność
Ta zmiana jest zmianą behawioralną.
Przyczyna wprowadzenia zmiany
W oficjalnej wersji platformy .NET 8 obsługa używania typów ogólnych w UnsafeAccessorAttribute programie była niezamierzona. Na początku programowania był to prawdopodobnie obsługiwany scenariusz, ale został później odroczony do platformy .NET 9, ponieważ zespół napotkał problemy ze złożonością. Oficjalna dokumentacja nie wspomniała o rodzajach ogólnych ani nie zawierała żadnych przykładów przy użyciu typów ogólnych. Ta zmiana poprawia zachowanie.
Zalecana akcja
Przeczytaj zaktualizowaną dokumentację interfejsu UnsafeAccessorAttribute API i zmień kod zgodnie z potrzebami, aby dopasować nowe ograniczenia dla typów ogólnych.