Sdílet prostřednictvím


Podpora altered UnsafeAccessor pro uzavřené obecné typy

Rozhraní .NET 8 zavedlo UnsafeAccessorAttribute atribut, který umožňuje přístup k neviditelovým členům typů (AKA "rychlá privátní reflexe"). Podpora obecných typů v .NET 8 nebyla přidána kvůli časovým omezením. V CoreCLR a nativní AOT však některé velmi úzké a nepodporované scénáře zahrnující uzavřené obecné typy fungovaly. Tyto scénáře by měly být zablokované, ale neúmyslně nebyly. V .NET 9 jsme přidali nová omezení.

Další informace a příklady najdete v poznámkách k atributu UnsafeAccessorAttribute.

Předchozí chování

V .NET 8 byla implementována naïve vyhledávání podpisů u typů a použití obecných typů bylo v některých případech považováno za platné. Například následující kód byl úspěšný:

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

Nové chování

Počínaje rozhraním .NET 9 je plně podporovaný a zdokumentovaný způsob, jak používat obecné typy, je zajistit, aby parametry typu metody odpovídaly parametrům extern static typu privátní metody a parametry extern static metody odpovídají parametrům metody privátní metody. Tato omezení jsou nezbytná, protože modul runtime provádí striktní shodu podpisu metadat.

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

Zavedená verze

.NET 9 Preview 6

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

V oficiální verzi .NET 8 byla podpora pro použití obecných typů UnsafeAccessorAttribute s neúmyslným. V rané fázi vývoje to byl pravděpodobně podporovaný scénář, ale později byl odložen až do .NET 9, protože tým narazil na problémy se složitostí. Oficiální dokumentace nezmiňovala obecné typy ani neposkytovala žádné příklady použití obecných typů. Tato změna chování opraví.

Přečtěte si aktualizovanou dokumentaci k UnsafeAccessorAttribute rozhraní API a podle potřeby změňte kód tak, aby odpovídal novým omezením pro obecné typy.

Ovlivněná rozhraní API