Compartilhar via


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.

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.

APIs afetadas