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 é umref struct
ou um parâmetro de tipo que permiteref 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 valoresref struct
. - CS9050: um campo
ref
não pode se referir a umref 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 valoresref struct
. - CS9050: um campo
ref
não pode se referir a umref struct
. - CS9059: um campo
ref
só pode ser declarado em umref 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 implementadasref
automaticamente. - Somente tipos
ref struct
ou variáveisref
podem ter o modificadorscoped
. - Um campo
ref
só pode ser declarado em um tiporef struct
. - Um campo
ref
não pode se referir a um tiporef 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 é umref struct
ou um parâmetro de tipo que permiteref 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 tiporef 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. Oref 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çãoallows ref struct
.– A antirrestriçãoallows ref struct
precisa ser a última na cláusulawhere
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 umref struct
tipo não pode ser usado como o tipo de elemento para um método iterador.