Supporto di UnsafeAccessor modificato per i generici chiusi
.NET 8 ha introdotto l'attributo UnsafeAccessorAttribute, che consente l'accesso ai membri non visibili dei tipi (anche noto come "riflessione privata veloce"). Il supporto per i generici in .NET 8 non è stato aggiunto a causa di vincoli di tempo. Tuttavia, in CoreCLR e nell'AOT nativo, alcuni scenari molto ristretti e non supportati che coinvolgevano tipi di generici chiusi funzionavano. Questi scenari avrebbero dovuto essere bloccati, ma inavvertitamente non lo sono stati. Sono state aggiunte nuove restrizioni in .NET 9.
Per ulteriori informazioni ed esempi, vedere le osservazioni per UnsafeAccessorAttribute.
Comportamento precedente
In .NET 8 è stata implementata una ricerca ingenua della firma sui tipi e l'uso di tipi generici è stato ritenuto valido in alcuni casi. Ad esempio, il codice seguente ha avuto esito positivo:
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);
Nuovo comportamento
A partire da .NET 9, il modo completamente supportato e documentato per usare tipi generici è garantire che i parametri di tipo di un metodo extern static
corrispondano ai parametri di tipo del metodo privato e i parametri del metodo di un metodo extern static
corrispondano ai parametri del metodo privato. Queste restrizioni sono necessarie perché il runtime esegue una corrispondenza rigorosa con la firma dei metadati.
class Accessor<T>
{
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
public extern static void CtorAsMethod(List<T> c);
}
Versione introdotta
.NET 9 Anteprima 6
Tipo di modifica che causa un'interruzione
Questa è una modifica funzionale.
Motivo della modifica
Nella versione ufficiale di .NET 8, il supporto per l'uso di tipi generici con UnsafeAccessorAttribute non era intenzionale. Nelle prime fasi dello sviluppo, questo scenario era probabilmente supportato, ma è stato successivamente rinviato a .NET 9 perché il team ha riscontrato problemi di complessità. La documentazione ufficiale non ha menzionato i generici, né ha fornito esempi che usano generici. Questa modifica corregge il comportamento.
Azione consigliata
Leggere la documentazione aggiornata per l'API UnsafeAccessorAttribute e modificare il codice in base alle esigenze per adattarlo alle nuove restrizioni per i tipi generici.