Suporte do UnsafeAccessor alterado para genéricos fechados
O .NET 8 introduziu o atributo UnsafeAccessorAttribute, que permite o acesso a membros de tipos não visíveis (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 isso não ocorreu. Novas restrições foram adicionadas ao .NET 9.
Para obter mais informações e exemplos, confira as observações para UnsafeAccessorAttribute.
Comportamento anterior
No .NET 8, uma pesquisa de assinatura ingênua sobre tipos foi implementada, e o uso de tipos genéricos foi considerado válido em alguns casos. Por exemplo, o seguinte código teve sucesso:
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);
Novo comportamento
A partir do .NET 9, a maneira totalmente compatível e documentada de consumir tipos genéricos é garantir que os parâmetros de tipo de um método extern static
correspondam aos parâmetros de tipo do método privado e que os parâmetros de método de um método extern static
correspondam aos parâmetros de método do método privado. Essas restrições são necessárias porque o runtime executa uma correspondência estrita de assinatura de metadados.
class Accessor<T>
{
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
public extern static void CtorAsMethod(List<T> c);
}
Versão introduzida
.NET 9 Preview 6
Tipo de alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
Na versão oficial do .NET 8, o suporte para o uso de tipos genéricos com o UnsafeAccessorAttribute não foi intencional. No início do desenvolvimento, este era um cenário possivelmente compatível, mas depois foi adiado até o .NET 9 porque a equipe se deparou com problemas de complexidade. A documentação oficial não mencionou genéricos, nem forneceu exemplos usando genéricos. Esta alteração corrige o comportamento.
Ação recomendada
Leia a documentação atualizada da API UnsafeAccessorAttribute e altere seu código conforme necessário para corresponder às novas restrições para tipos genéricos.