Partilhar via


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.

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.

APIs afetadas