Compartilhar via


Erros e avisos associados a tipos ref struct

  • CS8343: ref structs não podem implementar interfaces
  • CS8344: a instrução foreach não pode operar em enumeradores em métodos assíncronos ou iteradores porque o tipo é um ref struct ou um parâmetro de tipo que permite ref struct.
  • CS8345: a propriedade de campo ou implementada automaticamente não pode ser do tipo, a menos que seja um membro de instância de um ref struct.
  • CS9048: o modificador scoped pode ser usado somente para refs e valores ref struct.
  • CS9050: um campo ref não pode se referir a um ref struct.
  • CS9059: um campo ref só pode ser declarado em um ref struct.
  • CS9241: 'ref struct' já está especificado.
  • CS9242: a cláusula de restrição 'allows' precisa ser a última restrição especificada.
  • CS9243: não é possível permitir que ref structs para um parâmetro de tipo conhecido de outras restrições sejam uma classe.
  • CS9244: o tipo pode não ser um ref struct ou um parâmetro de tipo que permite ref structs para usá-lo como parâmetro no tipo ou método genérico.
  • CS9245: o tipo não pode implementar o membro da interface para o tipo ref struct.
  • CS9246: não é possível acessar um membro de interface de instância não virtual em um parâmetro de tipo que permita o ref struct.
  • CS9247: a instrução foreach não pode operar em enumeradores do tipo porque é um parâmetro de tipo que permite o ref struct e não é conhecido no tempo de compilação para implementar IDisposable.
  • CS9267: O tipo de elemento de um iterador pode não ser um ref struct ou um parâmetro de tipo que permite ref structs

violações de segurança de ref

  • CS8345: a propriedade de campo ou implementada automaticamente não pode ser do tipo, a menos que seja um membro de instância de um ref struct.
  • CS9048: o modificador scoped pode ser usado somente para refs e valores ref struct.
  • CS9050: um campo ref não pode se referir a um ref struct.
  • CS9059: um campo ref só pode ser declarado em um ref struct.

Um tipo ref struct pode incluir campos ref. Outros tipos não podem incluir campos ref. O compilador impõe restrições às declarações e ao uso de tipos ref struct para impor regras de segurança ref em instâncias de qualquer tipo ref struct:

  • Somente ref struct os tipos podem conter propriedades implementadas ref automaticamente.
  • Somente tipos ref struct ou variáveis ref podem ter o modificador scoped.
  • Um campo ref só pode ser declarado em um tipo ref struct.
  • Um campo ref não pode se referir a um tipo ref struct

Violar qualquer uma dessas regras produz um dos erros listados. Se você pretendia usar esse recurso de linguagem de programação, converta o tipo em um ref struct. Caso contrário, remova o constructo não permitido.

implementações da interface ref struct

  • CS8343: ref structs não pode implementar interfaces
  • CS8344: a instrução foreach não pode operar em enumeradores em métodos assíncronos ou iteradores porque o tipo é um ref struct ou um parâmetro de tipo que permite ref struct.
  • CS9241: 'ref struct' já está especificado.
  • CS9242: a cláusula de restrição 'allows' precisa ser a última restrição especificada.
  • CS9243: não é possível permitir que ref structs para um parâmetro de tipo conhecido de outras restrições sejam uma classe.
  • CS9244: o tipo pode não ser um ref struct ou um parâmetro de tipo que permite ref structs para usá-lo como parâmetro no tipo ou método genérico.
  • CS9245: o tipo não pode implementar o membro da interface para o tipo ref struct.
  • CS9246: não é possível acessar um membro de interface de instância não virtual em um parâmetro de tipo que permita o ref struct.
  • CS9247: a instrução foreach não pode operar em enumeradores do tipo porque é um parâmetro de tipo que permite o ref struct e não é conhecido no tempo de compilação para implementar IDisposable.
  • CS9267: O tipo de elemento de um iterador pode não ser um ref struct ou um parâmetro de tipo que permite ref structs

Antes do C# 13, os tipos ref struct não podem implementar interfaces; o compilador gera CS8343. Com o C# 13 e posteriores, os tipos ref struct podem implementar interfaces, sujeitos às seguintes regras:

  • Não é possível converter um ref struct em uma instância de uma interface que ele implementa. Esta restrição inclui a conversão implícita quando você usa um tipo ref struct como argumento quando o parâmetro é um tipo de interface. A conversão resulta em uma conversão de boxing, que viola a segurança de ref.
  • Um ref struct que implementa uma interface deve implementar todos os membros da interface. O ref struct deve implementar membros em que a interface inclua uma implementação padrão.

A partir do C# 13, um ref struct pode ser usado como um argumento de tipo para um parâmetro de tipo genérico, se e somente se o parâmetro de tipo genérico tiver a antirrestrição allows ref struct. Ao usar a antirrestrição allows ref struct, você precisa seguir estas regras:

  • Um ref struct é usado como um argumento de tipo, o parâmetro de tipo precisa ter a antirrestrição allows ref struct.– A antirrestrição allows ref struct precisa ser a última na cláusula where para esse parâmetro
  • Usos de instâncias em que o parâmetro de tipo precisa obedecer às regras de segurança de ref.
  • Um ref struct argumento ou um tipo que pode ser um ref struct tipo não pode ser usado como o tipo de elemento para um método iterador.