Suporte InsafeAccessor alterado para genéricos fechados
O .NET 8 introduziu o atributo, que permite o UnsafeAccessorAttribute acesso a membros não visíveis de tipos (também conhecido como "reflexão privada rápida"). O suporte para genéricos no .NET 8 não foi adicionado devido a restrições de tempo. No entanto, no CoreCLR e no AOT nativo, alguns cenários muito estreitos e sem suporte envolvendo tipos genéricos fechados funcionaram. Esses cenários deveriam ter sido bloqueados, mas inadvertidamente não foram. Novas restrições foram adicionadas no .NET 9.
Para obter mais informações e exemplos, consulte os comentários para UnsafeAccessorAttribute.
Comportamento anterior
No .NET 8, uma pesquisa de assinatura ingênua em tipos foi implementada, e o uso de tipos genéricos foi considerado válido em alguns casos. Por exemplo, o seguinte código foi bem-sucedido:
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);
Novo comportamento
A partir do .NET 9, a maneira totalmente suportada e documentada de consumir tipos genéricos é garantir que os parâmetros de tipo de um extern static
método correspondam aos parâmetros de tipo do método privado e os parâmetros de método de um extern static
método correspondam aos parâmetros de método do método privado. Essas restrições são necessárias porque o tempo de execução executa uma correspondência de assinatura de metadados estrita.
class Accessor<T>
{
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
public extern static void CtorAsMethod(List<T> c);
}
Versão introduzida
.NET 9 Visualização 6
Tipo de mudança de rutura
Esta mudança é uma mudança comportamental.
Razão para a alteração
Na versão oficial do .NET 8, o suporte para o uso de tipos genéricos com UnsafeAccessorAttribute não foi intencional. No início do desenvolvimento, era um cenário possivelmente suportado, mas foi posteriormente adiado para o .NET 9 porque a equipe encontrou problemas de complexidade. A documentação oficial não mencionava os genéricos, nem fornecia quaisquer exemplos de utilização de genéricos. Essa alteração corrige o comportamento.
Ação recomendada
Leia a documentação atualizada para a UnsafeAccessorAttribute API e altere seu código conforme necessário para corresponder às novas restrições para tipos genéricos.