Compartilhar via


Membros abstratos estáticos declarados em interfaces

O .NET 6 apresenta uma prévia de um novo recurso em que static os membros da interface podem ser marcados como abstract. Esse recurso envolve várias alterações na especificação ECMA 335 para permitir padrões de metadados de IL (linguagem intermediária) que antes eram considerados ilegais. Para obter mais informações, consulte dotnet/runtime#49558.

Comportamento antigo

Se uma interface estática foi marcada como abstract:

  • O compilador C# gerou o erro CS0112.
  • Ferramentas e outros compiladores geraram metadados de IL ilegais.

Novo comportamento

A partir do .NET 6, os membros da interface estática podem ser marcados como abstract e serão compilados com êxito. Além disso, os padrões de metadados il gerados agora são considerados legais devido a alterações na especificação ECMA 335.

A implementação de membros da interface static abstract é fornecida por tipos que implementam a interface.

Observação

Para o .NET 6, você deve habilitar recursos de visualização em seu projeto para poder marcar um membro da interface como static abstract.

Como este é um padrão IL recentemente legitimado, as ferramentas existentes podem processar os metadados associados de forma incorreta e apresentar um comportamento inesperado. É provável que as ferramentas encontrem o novo padrão de metadados, pois as interfaces com membros static abstract agora aparecem nos tipos primitivos, por exemplo, System.Int32.

Versão introduzida

.NET 6

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade binária.

Motivo da alteração

Essa alteração foi introduzida porque não havia como abstrair sobre membros estáticos e gravar código generalizado que se aplica entre tipos que definem esses membros estáticos. Isso foi particularmente problemático para tipos de membro que existem apenas em uma forma estática, por exemplo, operadores.

Atualize todas as ferramentas que consomem binários .NET ou código-fonte C# para considerar o novo conceito de membros da static abstract interface, incluindo aqueles que agora existem nos tipos primitivos do .NET.

APIs afetadas

Não aplicável

Consulte também